首页 > Java > javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

自从 ChatGPT 横空出世之后,突然没了写博客的兴趣,因为无论有什么问题,随便往 ChatGPT 一帖,结果就哗哗的出来了,今天这个问题就是。前一段时间和某公司联调接口,对方的接口测试环境好好的,一上线调不通,报错信息就是标题,只见贴到 ChatGPT,ChatGPT 回答如下:

这个错误通常是由于缺少信任证书或证书链不完整导致的。解决方法通常有两种:

1. **添加证书到信任库**:获取正确的证书,并将其添加到 Java 的信任库中。可以使用 `keytool` 工具来完成此操作。具体步骤如下:

– 首先,使用以下命令导出证书:

     keytool -printcert -rfc -sslserver <hostname> -port <port>
     

其中

<hostname>

<port>

是你要访问的 HTTPS 接口的主机名和端口号。

– 然后将证书导出到一个文件中。

– 最后,使用以下命令将证书添加到 Java 的信任库中:

     keytool -importcert -file <certificate-file> -keystore <path-to-truststore> -alias <alias>
     

其中

<certificate-file>

是你导出的证书文件,

<path-to-truststore>

是 Java 信任库的路径,

<alias>

是证书的别名。

2. **忽略证书验证**:如果你确定你要连接的服务器是安全的,并且不需要严格的证书验证,你可以在 Java 代码中忽略证书验证。但这不是推荐的做法,因为可能会导致安全风险。你可以使用 `TrustManager` 接口实现自定义的信任管理器,然后将其应用于 SSL 连接。下面是一个简单的示例代码:

   import javax.net.ssl.*;
   import java.security.cert.X509Certificate;

   public class SSLCertificateIgnore {
       public static void main(String[] args) throws Exception {
           // Create a trust manager that does not validate certificate chains
           TrustManager[] trustAllCerts = new TrustManager[]{
               new X509TrustManager() {
                   public X509Certificate[] getAcceptedIssuers() {
                       return null;
                   }
                   public void checkClientTrusted(X509Certificate[] certs, String authType) {
                   }
                   public void checkServerTrusted(X509Certificate[] certs, String authType) {
                   }
               }
           };

           // Install the all-trusting trust manager
           SSLContext sc = SSLContext.getInstance("SSL");
           sc.init(null, trustAllCerts, null);
           HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

           // Now you can access the HTTPS endpoint without certificate validation
       }
   }
   

请注意,这种方法会降低安全性,因为它会使你的应用程序容易受到中间人攻击。因此,最好的做法是第一种方法,即添加正确的证书到信任库中。

因为调用三方接口,不可能使用第一种方法,所以直接采用第二种,把代码贴进去,解决,完美,一点脑子都不用动!

全文完,如果本文对您有所帮助,请花 1 秒钟帮忙点击一下广告,谢谢。

作 者: BridgeLi,https://www.bridgeli.cn
原文链接:http://www.bridgeli.cn/archives/749
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
分类: Java 标签:
  1. 本文目前尚无任何评论.

请输入正确的验证码