【问题标题】:Java 7 SSL changes with Java 6Java 7 SSL 随 Java 6 的变化
【发布时间】: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。问题已解决,如先前的评论

标签: java ssl


【解决方案1】:

我的神秘异常的答案是,在 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[]{};
    }

【讨论】:

  • 完全帮助我解决了javax.net.ssl.SSLException: java.lang.UnsupportedOperationException所面临的问题
猜你喜欢
  • 2013-04-11
  • 2013-07-31
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
相关资源
最近更新 更多