美文网首页java
【SSL】javax.net.ssl.SSLHandshakeE

【SSL】javax.net.ssl.SSLHandshakeE

作者: Bogon | 来源:发表于2024-01-24 17:55 被阅读0次
    [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 请求时可能会出现其他问题。如果问题仍然存在,我建议你提供更多的错误信息和相关代码,以便我能够更好地帮助你解决问题。

    相关文章

      网友评论

        本文标题:【SSL】javax.net.ssl.SSLHandshakeE

        本文链接:https://www.haomeiwen.com/subject/wmdmodtx.html