java

【SSL】javax.net.ssl.SSLHandshakeE

2024-01-24  本文已影响0人  Bogon
[2024-01-25 13:52:57.052]  INFO [qtp1256728724-19] com.kingdee.open.org.service.imp.PersonService - -------login_url:https://www.example.com/test/rest/login|https://www.example.com/test/rest/login
[2024-01-25 13:52:57.061]  ERROR [qtp1256728724-19] com.kingdee.open.org.util.HttpClientUtil - Received fatal alert: handshake_failure
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 是一个SSL握手异常,发生在SSL/TLS握手过程中。

这个异常通常发生在以下几种情况下:

  1. 协议版本不匹配:客户端和服务器之间的协议版本不兼容,导致SSL握手失败。这可能是由于客户端和服务器之间的协议配置不正确。
  2. 密钥库问题:密钥库的配置可能不正确,例如密钥库文件不存在、密码错误等。
  3. 证书问题:服务器证书可能过期、不受信任、不匹配等。客户端可能无法验证服务器证书,导致握手失败。
  4. 通信问题:网络连接可能存在问题,例如防火墙、代理等可能干扰了握手过程。

要解决这个问题,可以尝试以下几个步骤:

  1. 检查协议版本:确保客户端和服务器之间的协议版本兼容。可以尝试调整SSL/TLS版本配置。
  2. 检查密钥库配置:确保密钥库的配置正确,包括密钥库文件的位置和密码。
  3. 检查证书配置:确保服务器证书正确配置,并且客户端能够正确验证服务器证书。可以尝试更新证书或添加信任证书。
  4. 检查通信问题:检查网络连接,确保没有防火墙、代理等干扰握手过程的问题。

如果以上步骤无法解决问题,建议联系系统管理员或开发人员,以获取更详细的故障排除和解决方案。

SSL握手是在建立HTTPS连接时进行的安全协议协商过程。
在Java中,通常有一些常见的原因导致SSL握手失败:

  1. 证书验证失败:当目标服务器的SSL证书无效、过期、或者不受信任时,会导致握手失败。你可以检查目标服务器的SSL证书是否有效,并确保Java程序的信任库中包含目标服务器的根证书。

  2. 协议版本不匹配:Java程序和目标服务器之间的SSL协议版本可能不匹配。你可以尝试设置Java程序使用与目标服务器相同的SSL协议版本。

  3. 密钥库或信任库配置问题:Java程序使用密钥库和信任库来管理SSL证书。确保密钥库和信任库的配置正确,并且包含了正确的证书和密钥。

下面是一些可能的解决方案:

  1. 检查目标服务器的SSL证书是否有效,并确保Java程序的信任库中包含目标服务器的根证书。

  2. 尝试设置Java程序使用与目标服务器相同的SSL协议版本。可以通过设置系统属性来实现,例如:

    System.setProperty("https.protocols", "TLSv1.2");
    
  3. 检查Java程序的密钥库和信任库的配置是否正确,并确保包含了正确的证书和密钥。

如果以上解决方案无法解决问题,请提供更多的错误信息和相关代码,以便我能够更好地帮助你解决问题。

为什么使用 curl 发起对 https://www.example.com/test/rest/login 的http请求确没有这种报错 ?

Curl 和 Java 在处理 HTTPS 请求时使用的是不同的 SSL/TLS 库。Curl 使用的是 OpenSSL,而 Java 使用的是自己的实现,即 Java Secure Socket Extension (JSSE)。

可能的原因是 Java 和 Curl 在 SSL/TLS 握手过程中使用了不同的默认协议版本、密码套件和证书验证策略。这些差异可能导致在使用 Java 发起 HTTPS 请求时出现握手失败的错误,而使用 Curl 则没有出现这个问题。

为了排除这个问题,你可以尝试在 Java 代码中显式地设置和 Curl 相同的 SSL/TLS 协议版本和密码套件。你可以使用 SSLSocket.setEnabledProtocols()SSLSocket.setEnabledCipherSuites() 方法来设置。

另外,Curl 默认情况下信任系统的根证书,而 Java 默认情况下使用自己的信任库。你可以尝试在 Java 代码中加载目标服务器的根证书到信任库中,以使 Java 信任该服务器。

请注意,Java 和 Curl 的差异可能还有其他方面的影响,因此在处理 HTTPS 请求时可能会出现其他问题。如果问题仍然存在,我建议你提供更多的错误信息和相关代码,以便我能够更好地帮助你解决问题。

上一篇下一篇

猜你喜欢

热点阅读