Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java 1.7和Java 1.8之间通信时握手失败_Java_Ssl_Resttemplate_Sslhandshakeexception - Fatal编程技术网

在Java 1.7和Java 1.8之间通信时握手失败

在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

从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-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.8
openssl密码-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密码套件。这就是为什么例外会说“不受支持”;这意味着它不受支持。