(声明:我决不发挥想象力安全专家,也不是一个窗口专家对于这个问题)的TLSv1握手失败
设置:在我们这边
- 服务器:Java 1.6的(已添加BouncyCastle的到安全文件),在Windows 2003服务器
- 第三方客户端:Windows 2008的服务器与BizTalk
- 由于重新谈判的攻击引入的所有重新谈判系统属性“启用”在服务器端(不是安全的,我知道)
理想情况下,我们希望在我们的最后解决这个问题,但如有必要,可以向客户端提出修复建议。
客户端服务器有超过一个HTTPS连接连接到我们的服务器,但它总是失败,Wireshark的显示了以下的对话:
> TLSv1: Client Hello
< TLSv1: Alert (21): Unexpected Message
,按照RFC(http://www.ietf.org/ rfc/rfc2246.txt)警报(21)是指一个失败的解密,从我在wireshark中可以看到的情况来看,客户端建议的密码实际上都不被JRE 1.6支持(按照http://docs.oracle.com/javase/6/docs/technotes/guides/security/SunProviders.html#SupportedCipherSuites) 为了重现错误能够仔细检查它,我用一些其他软件测试:
- wfetch在Windows XP上以“https”选择将在的SSLv2执行初始客户端握手,则服务器将切换到的TLSv1回答,这个工作在Windows XP上与配置
- wfetch用“使用TLSv1”为初始握手将以同样的方式作为BizTalk服务器上配置有“HTTPS” 2008窗口
- wfetch将采用“使用TLSv1”为初始握手和以同样的方式作为BizTalk服务器
- IE失败(在Windows XP)失败会最初尝试使用具有相同失败结果的TLSv1握手,但立即再次尝试使用工作为 的SSLv3(此时我将所有Microsoft软件使用的中央配置均可在HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentCo ntrolSet \控制\ SecurityProviders \ Schannel中)
- Firefox使用的SSLv3对于整个会话,因此不存在问题
- OpenSSL的当它回答,没有问题出现
- 执行中的SSLv2初始握手,并且服务器切换到使用TLSv1 OpenSSL的可强制执行初始握手中的TLSv1为好,它提供了27个密码列表(而不是由基于Windows的软件提出了11个密码),并可以在不出现问题
连接到我的未经训练这强化了一个观点,即不兼容的密码命题是Windows仅支持密码套件的根源at不支持JVM(对于TLSv1)。 我已经在java.security文件中安装了bouncy castle作为附加提供程序,但无济于事。 我搜索了高和低,只发现可能websphere支持TLSv1的Windows密码,但没有办法下载独立提供程序来测试它的参考。 JRE 1.7不支持我们在JVM上运行的软件,因此升级不是一种选择(也许安全提供商可以安全降级?虽然我还没有找到它的下载) 我发现没有办法将密码添加到windows短编写c + +代码(我已经玩过上述提到的注册表设置没有效果)。
所以在最后我想知道以下情况之一会解决它,他们应该如何来完成:
- 提供商加入到可与由Windows所提出的密码进行的TLSv1工作JVM
- 某种方式强迫客户端做的SSLv3(最好不要的SSLv2)初始握手,或者如果使用TLSv1握手失败
- 某种方式为使用TLSv1添加JVM-支持的密码到客户端窗口至少重试
当然也赞赏任何其他解决方案。
编辑
Java版本是Java version (64 bit): 1.6.0_19-b04
。
提出密码列表是:
- TLS_RSA_WITH_RC4_128_MD5
- TLS_RSA_WITH_RC4_128_SHA
- TLS_RSA_WITH_3DES_EDE_CBC_SHA
- TLS_RSA_WITH_DES_CBC_SHA
- TLS_RSA_EXPORT1024_WITH_RC4_56_SHA
- TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA
- TLS_RSA_EXPORT_WITH_RC4_40_MD5
- TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5
- TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
- TLS_DHE_DSS_WITH_DES_CBC_SHA
- TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA
的无限强度加密政策文件安装。我试图设置javax.net.debug=all
并从控制台启动服务器,不出现额外的输出。我已经设置sun.security.ssl.allowUnsafeRenegotiation=true
无济于事。
EDIT 2
事实证明,我们所使用的软件用于HTTPS的自定义堆栈,而不是默认的。虽然我不知道TLS请求的哪个部分触发了错误(看到大多数TLSv1握手成功了),但似乎解决了此问题。
感谢您的反馈,它是一个有趣的,如果徒劳的搜索。活到老,学到老。
你可以显示客户端提出的密码列表吗? – Jonathan
什么是您正在使用的完整Java版本?另外:您是否在Java运行时安装了Unlimited Strength Cryptography策略文件? –
(您通常不需要添加BouncyCastle提供程序。)如果此应用程序使用“HttpsUrlConnection”,请尝试设置此系统属性:“https.protocols = SSLv3,TLS”。只是尝试其他一些事情:'sun.security.ssl.allowUnsafeRenegotiation = true'(不推荐,以防万一...)。在开启调试时查看是否有更多细节也是有用的:'javax.net.debug = all'或者至少'javax.net.debug = handshake'。 – Bruno