我正在使用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 reset
(stacktrace here))。在我的网络跟踪中,我可以看到客户端Hello消息(没有SNI扩展名)。服务器没有响应(我猜,因为如果没有SNI扩展,它甚至不响应。)
这应该发生什么吗?有没有办法阻止它删除SNI,或者我必须在设置它的验证内容中做些什么?
这也很奇怪,因为我verify
的{{1}}方法打印了一堆东西,但据我所知,它永远不会被调用。
修改
添加了一些堆栈跟踪并更正/添加了一些细节。
This question seems pretty similar,但根据我的判断,它确实没有明确的答案。