解决“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 证书的根证书。可以通过以下步骤进行查找:
- 打开目标网站,并在浏览器地址栏中点击锁形状的图标。
- 选择“证书信息”或类似选项。
- 在弹出窗口中,找到根证书,并记录其文件路径。
2.2. 安装证书
接下来,我们需要将根证书添加到 Java 的信任存储中。可以通过以下步骤完成:
- 打开 IntelliJ IDEA,并找到项目的根目录。
- 在根目录下创建一个名为
certs
的文件夹。 - 将之前记录的根证书文件复制到
certs
文件夹中。
2.3. 配置项目
最后,我们需要在项目中配置 SSL 证书验证。可以通过以下步骤完成:
- 打开项目中的代码文件,并找到需要进行 SSL 连接的部分。
- 找到与 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