【问题标题】:Handshake failure while communicating between Java 1.7 to Java 1.8在 Java 1.7 和 Java 1.8 之间进行通信时握手失败
【发布时间】:2021-03-07 20:07:50
【问题描述】:

我在从 Java 1.7 调用服务到 Java 1.8 时遇到问题。我会尝试解释我在做什么。

Server 1 java 版本是 1.7.0_79(很遗憾我无法更改)。我正在使用 Spring Rest 模板进行通信。我知道 1.7 使用 TLS1 而 Java 8 使用 TLS1.2。我在 1.8 版本上尝试了与双方的这种通信,并且我能够通信,所以我确信证书是好的。

我使用该命令检查服务器 2 使用的密码

$ openssl s_client -connect <server>:8443 -tls1_2

得到回应

..... Long certificate chain

SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: AC92BFBC090F4245271C10B9C5B968D1845278AE03714ED5806B4929DC3D0CC9

所以在我看来,服务器正在使用这些协议和密码。因此,如果我使用相同的协议和密码,我应该能够进行通信。为了再次确保这个特定的密码在那里,我让我的同事在服务器 2 上运行以下命令

openssl ciphers -v

得到以下回复

... lot of ciphers
ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(128) Mac=AEAD

所以我确定服务器支持 ECDHE-RSA-AES128-GCM-SHA256 并且我对我的 Rest Template 的 SSLConnectionSocketFactory 进行了更改

public SSLConnectionSocketFactory sslConnectionSocketFactory() throws Exception {

        return new SSLConnectionSocketFactory(sslContext(),
                new String[] {
                        "TLSv1.2"
                },
                new String[] {
                        "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
                },
                NoopHostnameVerifier.INSTANCE);
    }

但我仍然收到错误

"Unsupported ciphersuite TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"

你能指导我正确的方向吗?我搜索了很多,但找不到解决方案。提前致谢。

【问题讨论】:

  • 您在哪里运行openssl 命令?它来自您运行RestTemplate 客户端的同一环境吗?
  • TLS 1.2 可以通过环境设置启用:stackoverflow.com/questions/39157422/…你试过了吗?
  • @Alex Chernyshev 我试过这样做,但没有奏效。我认为我的 java 版本是 1.7.0_79,我认为这些变量适用于更高版本。不幸的是,我无法更改 Java 版本。
  • @Savior Server 1 正在运行 1.7 并且 spring 模板正在此上运行。我跑了``` openssl s_client -connect :8443 -tls1_2``` 得到..... Long certificate chain SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-AES128-GCM-SHA256 Session-ID: AC92BFBC090F4245271C10B9C5B968D1845278AE03714ED5806B4929DC3D0CC9 Server 2 is running 1.8 openssl ciphers -v is run on Server 2 得到响应 ... lot of ciphers ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD
  • 如果您指的是该链接中第一个&accepted 答案中的脚本,它使用显然支持的版本的 OpenSSL(特别是调用 OpenSSL 库 libssllibcryptoopenssl 命令行) GCM 密码套件。您的客户端程序是 Java,而普通 Java 不使用 OpenSSL,尽管 Wildlfly 'native' 可以在 incoming 上使用。 SSL/TLS 的 Java 实现称为 JSSE,正如我所说,Oracle Java 7 中的 JSSE 不支持 GCM 密码套件,除非在最近的付费版本中您没有。这就是异常显示“不支持”的原因;表示不支持。

标签: java ssl resttemplate sslhandshakeexception


【解决方案1】:

正如@dave_thompson_085 提到的,问题出在密码套件上。我应该早点发现 :) 第二台服务器只有 2 个用于 TLS 1.2 的密码套件(不知道为什么或如何),而且两者都是 GCM,我的服务器不支持。谢谢大家的帮助。

【讨论】:

    猜你喜欢
    • 2020-01-26
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多