解决 javax.net.ssl.SSLHandshakeException: PKIX path building failed: SunCertPathBuilderException 问题

作者:暴富20212024.01.17 11:45浏览量:114

简介:在 Java 中,这个异常通常发生在尝试建立 SSL 连接时,由于证书链验证失败而无法建立安全连接。本文将解释这个问题的原因,并提供解决方案。

这个异常信息 javax.net.ssl.SSLHandshakeException: PKIX path building failed: SunCertPathBuilderException 表示在尝试建立一个 SSL 连接时,Java 无法验证服务器证书的链路。这通常是由于以下几个原因:

  1. 服务器证书已过期或无效
  2. 客户端无法访问或信任用于签发服务器证书的 CA(证书颁发机构)
  3. 客户端或服务器的日期和时间设置不正确
    针对以上原因,我们可以采取以下解决方案:
  4. 检查服务器证书:确保服务器证书是有效的,并且没有过期。你可以使用 openssl 命令来验证服务器证书,例如:
    openssl s_client -connect example.com:443
    这将连接到 example.com 的 443 端口,并显示证书信息。如果证书无效或过期,你会在输出中看到相应的错误信息。
  5. 更新 Java 信任库:如果客户端无法信任用于签发服务器证书的 CA,你需要将该 CA 添加到 Java 的信任库中。你可以通过编辑 Java 的信任库文件(位于 $JAVA_HOME/jre/lib/security/cacerts)来实现这一点。使用 keytool 工具导入新的 CA 证书:
    keytool -import -alias newCA -keystore $JAVA_HOME/jre/lib/security/cacerts -file newCA.crt
    你需要使用 changeit 作为密码来访问信任库。确保将 newCA.crt 替换为你的 CA 证书文件名。
  6. 检查日期和时间设置:确保你的客户端和服务器的系统日期和时间是正确的。日期和时间的不匹配可能会导致 SSL 握手失败。你可以通过以下命令来检查日期和时间设置:
    date
    如果日期和时间不正确,你需要根据你所在的时区设置正确的日期和时间。在大多数 Linux 发行版中,你可以使用 timedatectl 命令来检查和设置日期和时间。例如:
    sudo timedatectl set-timezone America/New_York(将时区设置为纽约)
    sudo timedatectl set-time 'YYYY-MM-DD HH:MM:SS'(将日期和时间设置为指定的时间)
    请注意,在更改系统日期和时间之前,务必了解这可能会对系统上运行的其他应用程序产生影响。
  7. 使用最新版本的 Java:在某些情况下,使用最新版本的 Java 可以解决与 SSL 握手相关的问题。新版本的 Java 可能包含对 SSL/TLS 协议的改进和修复。你可以从 Oracle 或 OpenJDK 的官方网站下载最新版本的 Java 并安装它。
  8. 检查网络配置:有时,网络配置问题可能会导致 SSL 握手失败。确保你的客户端可以访问服务器的 IP 地址和端口号。你可以尝试使用 pingtelnet 命令来测试网络连接。例如:
    ping example.com(检查能否到达 example.com)
    telnet example.com 443(检查能否连接到 example.com 的 443 端口)
  9. 查看日志文件:查看 Java 和操作系统的日志文件可能会提供更多关于 SSL 握手失败的信息。你可以在 Java 的日志文件中查找与 SSL 握手相关的错误信息,例如在 $JAVA_HOME/jre/lib/logging/ 目录下的日志文件。操作系统的日志文件可能包含有关网络连接或证书验证失败的信息。在 Linux 上,你可以查看 /var/log/syslog/var/log/messages 文件。在 Windows 上,你可以查看事件查看器中的系统日志。通过查看日志文件,你可以获取更多关于问题的详细信息,并更好地理解问题的根本原因。