我的 J2SE 应用程序使用 HttpsUrlConnection 访问安全位置。在我将 JRE 更新到 1.7 之前,它曾经工作得很好。现在我得到“握手期间远程主机关闭连接”SSLException。在 JRE 1.6 和 JRE 1.7 下使用 -Djavax.net.debug=ssl:handshake 运行应用程序后,我的印象是在 1.7 下缓存的客户端会话无法恢复。
更新:我已经了解到,在 JRE 1.6 下,我的客户端应用程序使用 SSLv2Hello 封装。但是在 JRE 1.7 下它不会这样做,这很可能是导致异常的原因。我现在的问题是:如何为在 JRE 1.7 上运行的客户端启用 SSLv2Hello 封装?
更新#2:SSLv2Hello 在 JRE 7 上通过 System.setProperty("https.protocols", "TLSv1,SSLv2Hello") 完成。然而,这并没有使握手异常消失。事实证明,异常的真正原因是密码套件。在 JRE 6 上,服务器从客户端的选项中选择 SSL_RSA_WITH_RC4_128_MD5,而在 JRE 7 上,它始终使用 TLS_DHE_RSA_WITH_AES_128_CBC_SHA。由于某种原因,服务器无法使用 TLS_DHE_RSA_WITH_AES_128_CBC_SHA 恢复缓存会话。使用 System.setProperty("https.cipherSuites",SuggestedCipherSuites) 修补的问题,其中SuggestedCipherSuites 始终以 SSL_RSA_WITH_RC4_128_MD5 开头。这种方法有什么缺点吗?
更新#3:客户端的 SNI 扩展是困扰服务器的问题。请参阅http://docs.oracle.com/javase/7/docs/technotes/guides/security/enhancements7.html上的“JSSE 客户端的服务器名称指示 (SNI)”