Java 7 SSL 更改 Java 6

Java 7 SSL changes with Java 6

我有一些 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 没有这个。

Java6 的密码组是:

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:对等主机:MYIP:443,密码套件:SSL_RSA_WITH_RC4_128_MD5,协议:TLSv1,ID:....

但是Java7:

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

所以..根据这个linkhttps://www.playframework.com/documentation/2.3.x/CipherSuites

密码套件在 6、7、8 期间发生了很大变化

问题 A:这似乎是服务器密码套件问题 - 不符合 Java 7/8,您同意吗?这意味着解决此 Java 7/8 SSL 密码套件问题的唯一解决方案是将所有 Java 6 密码套件(好的 - 我知道它们很弱 - 添加到 java.security 证书文件)

问题B:有没有人遇到过类似的问题,你们是怎么解决的?

谢谢

我的神秘异常的答案是,在 1.6 中,我们按如下方式实现了 X509TrustManager,

@Override
public void checkClientTrusted(final X509Certificate[] chain, final String authType) throws CertificateException {
    throw new UnsupportedOperationException();
}

@Override
public X509Certificate[] getAcceptedIssuers() {
    throw new UnsupportedOperationException();
}

但在 1.7/1.8 中,我们需要这样做(也适用于 1.6)

    @Override
    public void checkClientTrusted(final X509Certificate[] chain, final String authType) throws CertificateException {
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return new X509Certificate[]{};
    }