设置自定义SSL HostnameVerifier会禁用SNI扩展

时间:2017-01-19 23:28:26

标签: java ssl sni

我正在使用HttpsURLConnection类打开与IIS Web主机的安全连接。它要求SNI扩展位于所有SSL连接中。

我也在使用X509TrustManager(much like in this answer)。它可以选择信任所有证书(即在信任链上不执行检查/验证,如上面的答案)或对信任链执行真正基本的检查(所有证书都没有过期,每个证书都是由前一个使用以前的证书的公钥调用X509Certificate.verify(PublicKey)函数。)

检查似乎工作得很好 - 它完成了所有检查并且所有验证都有效,并且它从checkServerTrusted方法返回而没有例外。

然而,它会抛出一个错误(在TrustManager的超级类中,因为它在stacktrace中有一个checkServerTrusted - 并且它与当我从我的TrustManager中抛出异常时)。它会抛出一个java.security.cert.CertificateException: No name matching host.com found。但是,它对我的​​服务器工作正常(即不会抛出此异常)。

这似乎是setting a default HostnameVerifier解决的一个常见问题(我让它一直都是真的)。​​

但是,这引入了一个新问题:它从SSL连接中删除了SNI扩展,我的服务器需要连接。在验证发生之前,这会导致SocketException: Connection resetstacktrace here))。在我的网络跟踪中,我可以看到客户端Hello消息(没有SNI扩展名)。服务器没有响应(我猜,因为如果没有SNI扩展,它甚至不响应。)

这应该发生什么吗?有没有办法阻止它删除SNI,或者我必须在设置它的验证内容中做些什么?

这也很奇怪,因为我verify的{​​{1}}方法打印了一堆东西,但据我所知,它永远不会被调用。

修改

添加了一些堆栈跟踪并更正/添加了一些细节。

This question seems pretty similar,但根据我的判断,它确实没有明确的答案。

0 个答案:

没有答案