在Java 1.7和Java 1.8之间通信时握手失败
从Java1.7到Java1.8调用服务时遇到问题。我会尽力解释我在做什么 Server1Java版本是1.7.0_79(不幸的是,我无法更改)。我正在使用SpringREST模板进行通信。我知道1.7使用TLS1,Java 8使用TLS1.2。我在版本1.8上尝试了与双方的沟通,我能够沟通,所以我确信证书是好的 我使用该命令检查服务器2使用的密码在Java 1.7和Java 1.8之间通信时握手失败,java,ssl,resttemplate,sslhandshakeexception,Java,Ssl,Resttemplate,Sslhandshakeexception,从Java1.7到Java1.8调用服务时遇到问题。我会尽力解释我在做什么 Server1Java版本是1.7.0_79(不幸的是,我无法更改)。我正在使用SpringREST模板进行通信。我知道1.7使用TLS1,Java 8使用TLS1.2。我在版本1.8上尝试了与双方的沟通,我能够沟通,所以我确信证书是好的 我使用该命令检查服务器2使用的密码 $openssl s_客户端-连接:8443-tls1_2 得到了回应 ..... Long certificate chain SSL-Sess
$openssl s_客户端-连接: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模板的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"
你能给我指一下正确的方向吗?我找了很多,但找不到解决办法。提前感谢。正如@dave_thompson_085所提到的,问题在于密码套件。我应该早点发现:)第二台服务器只有2套TLS1.2密码套件(不知道为什么或如何),而且都是GCM,我的服务器不支持。谢谢大家的帮助。您在哪里运行
openssl
命令?它是否与您运行restemplate
客户端的环境相同?TLS 1.2可以通过环境设置启用:您尝试过吗?@Alex Chernyshev我尝试过,但没有成功。我认为我的java版本是1.7.079,我认为这些变量适用于更高版本。很遗憾,我无法更改Java版本。@Savior服务器1正在运行1.7,spring模板正在运行。我运行了``openssl s_client-connect:8443-tls1_2``并得到了。。。。。长证书链SSL会话:协议:TLSv1.2密码:ECDHE-RSA-AES128-GCM-SHA256会话ID:AC92BFBC090F4245271C10B9C5B968D1845278AE03714ED5806B4929DC3D0CC9
服务器2正在运行1.8openssl密码-v
在服务器2上运行,并给出响应。。。大量密码ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128)Mac=AEAD
如果您指的是该链接中第一个被接受的答案中的脚本,那么它使用OpenSSL(特别是调用OpenSSL库的命令行libssl
和libcrypto
)显然支持GCM密码套件的版本。您的客户机程序是Java,普通Java不使用OpenSSL,尽管Wildlfly“native”可以在传入时使用。SSL/TLS的Java实现称为JSSE,正如我所说,Oracle Java 7中的JSSE(除了最近没有的付费版本)不支持GCM密码套件。这就是为什么例外会说“不受支持”;这意味着它不受支持。