【发布时间】:2015-02-03 06:57:04
【问题描述】:
我有一些 SSL 代码在 1.6 上运行良好,但在 1.7 和 1.8 上运行失败。 使用 -Djavax.net.debug=all 我检查了日志之间的差异,有些事情让我印象深刻(比较 1.6.0_43 和 1.7.0_60)
第一个区别是Java 7/8显示:
Ignoring unavailable cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
Ignoring unavailable cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA
等等
而 Java 6 没有这个。
Java 6 的密码套件是:
Cipher Suites: [SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_DES_CBC_SHA, SSL_DHE_RSA_WITH_DES_CBC_SHA, SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV]
对于 1.7:
Cipher Suites: [TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA, SSL_RSA_WITH_RC4_128_SHA, TLS_ECDH_ECDSA_WITH_RC4_128_SHA, TLS_ECDH_RSA_WITH_RC4_128_SHA, TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_RC4_128_MD5, TLS_EMPTY_RENEGOTIATION_INFO_SCSV]
两者之间有一些共同的套件。
另外,我可以在握手期间看到协议的长度...
Java 6 以
告终--> SSLSession: Peer Host: MYIP:443, Cipher Suite: SSL_RSA_WITH_RC4_128_MD5, Protocol: TLSv1, Id: ....
但是 Java 7:
main, handling exception: java.lang.UnsupportedOperationException
%% Invalidated: [Session-1, SSL_RSA_WITH_RC4_128_MD5]
main, SEND TLSv1 ALERT: fatal, description = internal_error
main, WRITE: TLSv1 Alert, length = 2
[Raw write]: length = 7
0000: 15 03 01 00 02 02 50 ......P
main, called closeSocket()
main, IOException in getSession(): javax.net.ssl.SSLException: java.lang.UnsupportedOperationException
--> debugSession(..)null
所以..根据这个链接https://www.playframework.com/documentation/2.3.x/CipherSuites
密码套件在 6、7、8 期间发生了很大变化
问题 A:这似乎是服务器密码套件问题 - 不符合 Java 7/8,您同意吗?这意味着解决这个 Java 7/8 SSL 密码套件问题的唯一解决方案是添加所有 Java 6 密码套件(好的 - 我知道它们很弱 - 到 java.security 证书文件)
问题 B:有没有人遇到过类似的问题,您是如何解决的?
谢谢
【问题讨论】:
-
嗨,好的..如果您遇到类似问题,只是为了帮助其他人,这似乎是一个“代码”问题,对 Java 7、8 我们处理 SSL 连接的方式有不利影响.我们的代码安装了 X509TrustManager 来验证服务器域。这似乎与 7、8 握手失败,但与 6 握手失败......谢谢
-
另外,我们之前对信任管理器的实现是为不受支持的方法抛出异常,而且似乎 7 和 8 不支持这样做,以下对 7、8 和 6 都有帮助:不要加入 checkClientTrusted 并为 getAcceptedIssuers 返回一个空数组
-
不清楚您是在实现客户端还是服务器。
checkClientTrusted只会在您设置验证客户端证书的服务器时调用(并且在 Java 6、7 和 8 之间不应该更改)。除此之外,您在哪个平台上运行它? -
它是客户端 - 用于测试的 Windows 7。问题已解决,如先前的评论