握手时SSLException恢复缓存会话

时间:2012-04-17 09:25:54

标签: java session exception encryption handshake

  

可能重复:
  SSL handshake alert: unrecognized_name error since upgrade to Java 1.7.0

我的J2SE应用使用HttpsUrlConnection访问安全位置。它曾经工作得很好,直到我将我的JRE更新为1.7。现在我得到了“握手时远程主机关闭连接”SSLException。在使用-Djavax.net.debug = ssl:handshake运行应用程序后,在JRE 1.6和JRE 1.7下,我的印象是1.7以下的缓存客户端会话无法恢复。

更新: 我已经明白,在JRE 1.6下,我的客户端应用程序使用SSLv2Hello封装。然而,它并没有在JRE 1.7下这样做,这很可能是导致异常的原因。我现在的问题是:如何为在JRE 1.7上运行的客户端启用SSLv2Hello封装?

更新#2 : SSLv2Hello通过System.setProperty(“https.protocols”,“TLSv1,SSLv2Hello”)在JRE 7上完成。然而,这并没有使握手异常消失。事实证明,例外的真正原因是密码套件。在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”,recommendedCipherSuites)修补问题,其中suggestedCipherSuite始终以SSL_RSA_WITH_RC4_128_MD5开头。这种方法有任何缺点吗?

更新#3 : 客户端的SNI扩展是困扰服务器的。请参阅http://docs.oracle.com/javase/7/docs/technotes/guides/security/enhancements7.html

上的“JSSE客户端的服务器名称指示(SNI)”

1 个答案:

答案 0 :(得分:3)

最后,事实证明该问题与JSSE客户端1.7中的SNI扩展有关。 解决方案是在访问https位置之前禁用发送SNI记录:

System.setProperty ("jsse.enableSNIExtension", "false");

非常感谢eckes的解决方案(见SSL handshake alert: unrecognized_name error since upgrade to Java 1.7.0)。