【发布时间】: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: AC92BFBC090F4245271C10B9C5B968D1845278AE03714ED5806B4929DC3D0CC9Server 2 is running 1.8openssl ciphers -vis 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 库
libssl和libcrypto的openssl命令行) GCM 密码套件。您的客户端程序是 Java,而普通 Java 不使用 OpenSSL,尽管 Wildlfly 'native' 可以在 incoming 上使用。 SSL/TLS 的 Java 实现称为 JSSE,正如我所说,Oracle Java 7 中的 JSSE 不支持 GCM 密码套件,除非在最近的付费版本中您没有。这就是异常显示“不支持”的原因;表示不支持。
标签: java ssl resttemplate sslhandshakeexception