2

我正在使用 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)。

谁能提示我可以在哪里插入服务器名称验证?

4

0 回答 0