java - 恢复缓存 session 时握手期间出现 SSLException

标签 java session exception encryption handshake

<分区>

Possible Duplicate:
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 下缓存的客户端 session 无法恢复。

更新: 我已经了解到,在 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 恢复缓存 session 。使用 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)”

最佳答案

最后发现问题出在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)。

关于java - 恢复缓存 session 时握手期间出现 SSLException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10188568/

相关文章:

c# - MvcSiteMapProvider 中各个项目的可见性?

c# - .NET 3.5 C# 错误与 System.Timer System.ObjectDisposedException : Cannot access a disposed object

C++ 异常 - 每个库一个或自定义一个

java - 使用递归计算序列

java - 如何在 Java 中访问自定义 Exception 类中的非构造函数方法?

java - RESTEasy - 如何为 ClientRequest 设置基本身份验证

php - Yii 中的 session

java - 如何使用Java将整数拆分为数组?

java - 如何使用 Struts 2 在 JSP 中打印 session 属性

.NET SOAP 扩展在 MethodInfo 中抛出 NullReferenceException?