当前位置: 首页 > 知识库问答 >
问题:

javax错误。网ssl。SSLHandshakeException:收到致命警报:握手失败

云季萌
2023-03-14

我正在尝试使用Spring RestTemplate调用POST Rest调用:

HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();

RestTemplate restTemplate = new RestTemplate(requestFactory);

HttpHeaders headers = new HttpHeaders();

headers.setContentType(MediaType.APPLICATION_XML);

HttpEntity<GetBalanceHistoryRequest> request1 = new     HttpEntity<GetBalanceHistoryRequest>(request, headers);
String result = restTemplate.postForObject("https://server.com/getBalance", request1, String.class);

这个https://server.com有证书:webapi。tartu-x86。p12我将证书导入C:\Java_8\jre\lib\security\cacerts usinf keytool

运行代码后,我出现以下错误:

SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
trustStore is: C:\Java_8\jre\lib\security\cacerts
trustStore type is : jks
trustStore provider is : 
init truststore
adding as trusted cert:
  Subject: CN=Equifax Secure Global eBusiness CA-1, O=Equifax Secure Inc., C=US
  Issuer:  CN=Equifax Secure Global eBusiness CA-1, O=Equifax Secure Inc., C=US
  Algorithm: RSA; Serial number: 0xc3517
  Valid from Mon Jun 21 07:00:00 IDT 1999 until Mon Jun 22 07:00:00 IDT 2020

adding as trusted cert:
  Subject: CN=SecureTrust CA, O=SecureTrust Corporation, C=US
  Issuer:  CN=SecureTrust CA, O=SecureTrust Corporation, C=US
....
....

** Finished
verify_data:  { 31, 64, 180, 145, 192, 1, 180, 119, 86, 70, 247, 140 }
***
[write] MD5 and SHA1 hashes:  len = 16
0000: 14 00 00 0C 1F 40 B4 91   C0 01 B4 77 56 46 F7 8C  .....@.....wVF..
Padded plaintext before ENCRYPTION:  len = 48
0000: 14 00 00 0C 1F 40 B4 91   C0 01 B4 77 56 46 F7 8C  .....@.....wVF..
0010: 3F 56 B1 14 65 F3 18 C6   B3 98 D3 50 65 AC 74 1A  ?V..e......Pe.t.
0020: 48 11 50 C0 0B 0B 0B 0B   0B 0B 0B 0B 0B 0B 0B 0B  H.P.............
main, WRITE: TLSv1 Handshake, length = 48
[Raw write]: length = 53
0000: 16 03 01 00 30 B6 A0 43   3D 91 3A C1 F6 34 F5 73  ....0..C=.:..4.s
0010: 54 A7 1A 46 84 42 1A DC   0D 4D B9 4A C1 3F CB A6  T..F.B...M.J.?..
0020: 57 C6 5D DF C4 1D 62 22   92 FB 1F 3E F1 05 0C 5C  W.]...b"...>...\
0030: 56 9E 9B 02 2D                                     V...-
[Raw read]: length = 5
0000: 15 03 01 00 02                                     .....
[Raw read]: length = 2
0000: 02 28                                              .(
main, READ: TLSv1 Alert, length = 2
main, RECV TLSv1 ALERT:  fatal, handshake_failure
%% Invalidated:  [Session-1, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA]
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLHandshakeException: Received                 fatal alert: handshake_failure
 main, called close()
 main, called closeInternal(true)

我使用的是Java1.8.091

有人能帮忙吗?

共有2个答案

夏侯承恩
2023-03-14

我也有同样的问题,我这样解决:

1-将p12文件转换为Java密钥库文件(.jks扩展名),并放入项目的resources文件夹:

keytool -importkeystore -srckeystore <pfxfilename.pfx> -srcstoretype pkcs12 -destkeystore <jks-filename.jks> -deststoretype JKS

2-实现一个请求工厂来使用你的JKS文件:

RestTemplate restTemplate = new RestTemplate();

ClientHttpRequestFactory requestFactory = null;
try {
    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    keyStore.load(
            this.getClass().getClassLoader().getResourceAsStream("jks-filename.jks"), //put your .jks file name here.
            "password".toCharArray()); //the .jks file password.

    SSLConnectionSocketFactory socketFactory = 
            new SSLConnectionSocketFactory(
                    new SSLContextBuilder()
                    .loadTrustMaterial(null, new TrustSelfSignedStrategy())
                    .loadKeyMaterial(keyStore, "password".toCharArray()).build()); //the .jks file password again...

    HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build();
    requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);

} catch (Exception e) {
    e.printStackTrace();
}

restTemplate.setRequestFactory(requestFactory);

3-您可能需要将Apache Httpclient添加到您的项目中。在Gradle项目中,添加:

compile ("org.apache.httpcomponents:httpclient")

准备好了!

另一个快速的解决方案是生成JKS文件,并将文件和密码作为JVM参数:

-Djavax.net.ssl.keyStore=/absolute/file/location/java/application/keystore.jks
-Djavax.net.ssl.keyStorePassword=jkspassword

或者放入java类静态块:

System.setProperty("javax.net.ssl.keyStore", "/absolute/file/location/java/application/keystore.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "jkspassword");
孔宇
2023-03-14

java SSL问题(如握手失败)的原因通常如下:

  • 不兼容的密码套件:客户端必须使用服务器启用的密码套件
  • SSL/TLS的不兼容版本:客户端必须确保它使用兼容的版本。例如,服务器可能会强制在java7中默认未启用的TLS1.2(不是你的情况)
  • 服务器证书的不完全信任路径:服务器证书可能不受客户端信任。通常修复方法是将服务器证书链导入到客户端信任存储中。
  • 错误的服务器配置,例如颁发给不同域或证书链的证书不完整。如果修复是在服务器部分

在您的情况下,当java8默认使用TLSv1.2时,似乎已经选择了TLSv1,因此服务器可能没有更新最新版本。

我建议调试协议消息ClientHello和ServerHello以查看套件中选择的协议和密码。

-Djavax.net.debug=ssl

还可以在SSLLAB中检查服务器的状态

 类似资料:
  • 我得到这个错误,而试图在linux上执行和旧的MapleStory服务器,我已经尝试了相同的文件在窗口和工作没有问题。我尝试了多个Java版本没有成功。

  • 我打以下电话给branch.io 它在我的本地机器上运行良好,但在服务器上出现故障。 Openssl版本: 本地:OpenSSL 0 . 9 . 8 ZG 2015年7月14日 服务器:OpenSSL 0.9.8e-fips-rhel5 2008年7月1日 Python: 本地:2.7.10服务器:2.7.6 分支io服务器连接: Chrome 已验证 DigiCert SHA2 安全服务器 CA

  • 我试图使用Java-pns向iPhone发送消息推送,但我收到以下错误... 这是我的密码。。。 对于<代码>通知测试。verifyKeystore我得到的是有效的is和。 我不明白为什么我会得到这个错误。 这是我的错误日志。。。 我不明白为什么证书颁发机构是空的?

  • > 客户端发送带有密码套件中包含的密码的“Client Hello”消息。 在server.xml中,这些密码都不出现。以下是catalina的条目: 连接器port=“4443”sslenabled=“true”acceptcount=“20000”maxthreads=“5000”allowtrace=“false”scheme=“https”secure=“true”clientauth=“

  • 以前有人遇到过这个错误吗?我是新来的SSL,我的客户有什么明显的问题吗?你好,我错过了吗?在没有ServerHello响应的情况下引发该异常。任何建议都很感激。 {http://xml.apache.org/axis/}stackTrace: ...

  • 我已经创建了一个SSLClient和SSLServer,也创建了密钥库作为"server.jks"为SSLServer和"client.jks"为SSLClient.它抛出一个异常""。我不知道为什么我得到这个异常。我遵循http://ruchirawageesha.blogspot.in/2010/07/how-to-create-clientserver-keystores.html为服务器和