2012-01-19 119 views
12

(声明:我决不发挥想象力安全专家,也不是一个窗口专家对于这个问题)的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握手成功了),但似乎解决了此问题。

感谢您的反馈,它是一个有趣的,如果徒劳的搜索。活到老,学到老。

+0

你可以显示客户端提出的密码列表吗? – Jonathan

+0

什么是您正在使用的完整Java版本?另外:您是否在Java运行时安装了Unlimited Strength Cryptography策略文件? –

+1

(您通常不需要添加BouncyCastle提供程序。)如果此应用程序使用“HttpsUrlConnection”,请尝试设置此系统属性:“https.protocols = SSLv3,TLS”。只是尝试其他一些事情:'sun.security.ssl.allowUnsafeRenegotiation = true'(不推荐,以防万一...)。在开启调试时查看是否有更多细节也是有用的:'javax.net.debug = all'或者至少'javax.net.debug = handshake'。 – Bruno

回答

1

事实证明,我们使用的软件使用HTTPs的自定义堆栈而不是默认值。虽然我不知道TLS请求的哪个部分触发了错误(看到大多数TLSv1握手成功了),但似乎解决了此问题。

感谢您的反馈,它是一个有趣的,如果徒劳的搜索。活到老,学到老。

0

您可以阅读我的文章detecting cipher strength(只是为了确保您正确安装了jce密码)。在你的问题中,你说你安装了无限制的密码,但是你引用了128位和40位密钥。所以,我对你有什么感到困惑。另外,您是否可以检查您尝试连接的SSL证书上的密码强度,并让我们知道它是什么以及算法是什么?此外,请确保您的JDK策略文件具有允许无限强度的适当权限。

最后,您是否可以连接到“已知良好”SSL站点以正确验证您的客户端握手? (例如Gmail网页)

+1

除了少数非常罕见的例外,希望使用SSL/TLS的用户可以这样做,因为他们希望在客户端和服务器之间建立安全连接。建议使用允许任何事情的信任管理器和接受任何事情的主机名验证者,这些都会使所有这些都无用。请停止提示这些“解决方法”。当然,他们摆脱了警告,但他们也使MITM攻击成为可能。 – Bruno

+0

对不起,自从我回答以来,这个问题似乎已经发生了很大的变化。我的答案可能不再相关。 – djangofan