我正在使用 Jetty HttpClient 发出 HTTPS 请求。在建立 SSL 连接之后,在发送数据之前,我想验证我正在与预期的服务器交谈。基本上,如果我想向 www.foo.com 发送请求,那么我想验证服务器是否具有该域名的证书。
实现这一点的一种方法是创建我自己的TrustManager
并将其用于创建SslContextFactory
提供给HttpClient
. 信任管理器中可用的回调是:
checkServerTrusted(X509Certificate[] chain, String authType)
checkServerTrusted(X509Certificate[] chain, String authType,
Socket socket)
checkServerTrusted(X509Certificate[] chain, String authType,
SSLEngine engine)
在所有情况下,我都可以访问证书,但不能访问原始请求(我需要原始域名)。
想到的第二个选项是从HttpExchange
我用来发出请求的后代访问对等证书。例如,调用后HttpClient.send(exchange)
,我可以访问对等证书并执行验证。但是,似乎无法从交换中访问 SSL 信息(对等证书SSLEngine
或对象)。SSLSocket
最重要的是,HttpClient 本身似乎没有对证书内容进行任何验证。这意味着我没有地方可以插入我的验证逻辑,并且 HttpClient 容易受到 DNS 欺骗攻击(有关该主题的讨论,请参见http://www.cs.utexas.edu/~shmat/shmat_ccs12.pdf)。
谁能提示我可以在哪里插入服务器名称验证?