解决“idea报错 javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun”问题

1. 问题描述

当在使用 IntelliJ IDEA 进行开发时,可能会遇到以下错误信息:

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

这个错误通常是由于 SSL 证书验证失败引起的。下面将介绍如何解决这个问题。

2. 解决方法

2.1. 查找证书

首先,我们需要找到用于验证目标 SSL 证书的根证书。可以通过以下步骤进行查找:

  1. 打开目标网站,并在浏览器地址栏中点击锁形状的图标。
  2. 选择“证书信息”或类似选项。
  3. 在弹出窗口中,找到根证书,并记录其文件路径。

2.2. 安装证书

接下来,我们需要将根证书添加到 Java 的信任存储中。可以通过以下步骤完成:

  1. 打开 IntelliJ IDEA,并找到项目的根目录。
  2. 在根目录下创建一个名为 certs 的文件夹。
  3. 将之前记录的根证书文件复制到 certs 文件夹中。

2.3. 配置项目

最后,我们需要在项目中配置 SSL 证书验证。可以通过以下步骤完成:

  1. 打开项目中的代码文件,并找到需要进行 SSL 连接的部分。
  2. 找到与 SSL 相关的代码片段,并添加以下代码:
System.setProperty("javax.net.ssl.trustStore", "certs/your-root-certificate-file.crt");
System.setProperty("javax.net.ssl.trustStorePassword", "your-root-certificate-password");

其中,your-root-certificate-file.crt 是之前复制到 certs 文件夹中的根证书文件名,your-root-certificate-password 是根证书的密码(如果有)。

3. 完整代码示例

以下是一个完整的示例代码,展示了如何配置 SSL 证书验证:

import java.io.IOException;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class SSLExample {
    public static void main(String[] args) throws NoSuchAlgorithmException, KeyManagementException, IOException {
        // 创建一个信任所有证书的 TrustManager
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }

            public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException {
            }

            public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
            }
        } };

        // 创建一个 SSLContext 对象,并初始化它,使用 trustAllCerts 信任所有证书
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());

        // 将默认的 SSL socket factory 设置为新创建的 SSLContext 对象
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

        // 创建一个 URL 对象
        URL url = new URL("

        // 打开连接
        HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
        conn.connect();

        // 读取响应
        System.out.println(conn.getResponseCode());
    }
}

4. 序列图

下面是一个使用序列图展示上述解决方案的示例:

sequenceDiagram
    participant User
    participant IntelliJ IDEA
    participant Browser
    User->>Browser: 打开目标网站
    Browser->>Browser: 点击锁形状的图标
    Browser-->>IntelliJ IDEA: 显示证书信息
    User->>IntelliJ IDEA: 创建名为 certs 的文件夹
    User->>User: 将根证书复制到 certs 文件夹中
    User->>IntelliJ IDEA: 编辑代码文件
    User-->>IntelliJ IDEA: 添加 SSL 配置代码
    IntelliJ IDEA->>Browser: 发送 HTTPS 请求
    Browser-->>Intelli