SSLCipherSuite SSL_RSA_WITH_3DES_EDE_CBC_SHA 的 JMS 连接握手失败

JMS connection handshake is failing for SSLCipherSuite SSL_RSA_WITH_3DES_EDE_CBC_SHA

我正在使用 Spring boot 1.2.2 和 JDK1.8.0.40,我已将 SSL 密码套件指定为 SSL_RSA_WITH_3DES_EDE_CBC_SHA 并将 cer 文件导入密钥库。

当我 运行 我的项目时,我将 jvm 参数设置如下:

-Djavax.net.debug=all -Djavax.net.ssl.keyStore=/java_home/jre/lib/security/cacerts -Djava.net.keyStorePassword=changeit

但我总是得到

handing exception:javax.net.ssl.SSLHandshakeException: No appropriate protocol(protocol is disabled or cipher suites are inappropriate)
SEND TLSv1.2 ALERT: fatal, description = handshake_failure
WRITE: TLSv1.2 Alert, length = 2
[Raw write]: length = 7
0000: 15 03 03 00 02 02 28       ......(
called closeSocket()
com.ibm.msg.client.jms.DetailedJMSException: JMSWMQ0018: Failed to connect to queue manager 'XXXX' with connection mode 'Client' and host name 'xxx.xxx.com(xxxxx)'.

确实我做了几个操作来解决这个问题,例如:

  1. 替换 jce jar 以无限加密
  2. 导入cer文件到jks
  3. 在 jvm 参数中指定了 jks 路径
  4. 使用匹配的 SSL 密码套件
  5. 使用 SSL 通道

但是现在,我还是握手失败,错误日志和上面一样。

或者我需要从我的机器生成 cer 并上传到服务器吗?能给点建议吗?

SSL_RSA_WITH_3DES_EDE_CBC_SHA 是 SSL 3 密码套件。 SSL 3 是不安全的,disabled by default 在 Java 8. 是否有任何理由将密码套件用于不安全的协议?

如果你想坚持使用一个密码套件,你可以选择一个 Java 8 supports

新 JDK 版本不断更新最低安全级别,这很好。但是,让所有相关组件的这些协议限制保持最新并不总是那么容易(或不可能)。

最好的方法确实是选择一个受支持的密码套件。

但是,如果您正在开发中(并且知道自己在做什么),为了测试,您可以通过编辑 JDK 的 jre\lib\security\java.security 文件来删除此限制。

搜索 jdk.tls.disabledAlgorithms 并删除或编辑限制

# previously: 
# jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 768
jdk.tls.disabledAlgorithms=MD5withRSA, DH keySize < 768