『问题记录』PKIX path building failed问题

『问题记录』PKIX path building failed问题

问题原因

Springboot请求外部https接口,由于ssl证书信任问题会导致PKIX path building failed问题。具体体现在请求小程序接口时,出现以上错误。

错误信息

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

解决方法

URL realUrl = null;
try {
    realUrl = new URL(url);
    if("https".equalsIgnoreCase(realUrl.getProtocol())){
        SslUtils.ignoreSsl();
    }
} catch (Exception e) {
    logger.error(e.toString());
}
ResponseEntity<String> response = restTemplate.getForEntity(String.valueOf(realUrl), String.class);

SslUntils库

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

public class SslUtils {

    private static void trustAllHttpsCertificates() throws Exception {
        TrustManager[] trustAllCerts = new TrustManager[1];
        TrustManager tm = new miTM();
        trustAllCerts[0] = tm;
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, null);
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    }

    static class miTM implements TrustManager,X509TrustManager {
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }

        public boolean isServerTrusted(X509Certificate[] certs) {
            return true;
        }

        public boolean isClientTrusted(X509Certificate[] certs) {
            return true;
        }

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

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

    /**
     * 忽略HTTPS请求的SSL证书,必须在openConnection之前调用
     * @throws Exception
     */
    public static void ignoreSsl() throws Exception{
        HostnameVerifier hv = new HostnameVerifier() {
            public boolean verify(String urlHostName, SSLSession session) {
                return true;
            }
        };
        trustAllHttpsCertificates();
        HttpsURLConnection.setDefaultHostnameVerifier(hv);
    }
}
<think>好的,我现在需要帮助用户解决在IntelliJ IDEA中使用Gradle时出现的“PKIX path building failed问题。首先,我要回顾之前提供的解决方案,看看哪些部分可以应用到Gradle上。用户之前的问题涉及到Maven和JDBC连接,现在换到Gradle,可能需要类似的方法,但具体步骤可能不同。 首先,用户提到了IDEA新导入的项目出现PKIX错误,这可能是因为Gradle在下载依赖时无法验证服务器的SSL证书。常见原因包括缺失根证书或中间证书,或者使用了自签名证书的仓库。 根据之前的解决方案,可能的解决途径有: 1. 将证书导入JDK的信任库(cacerts),这适用于所有使用该JDK的应用程序,包括Gradle。 2. 临时禁用SSL验证,但需要注意安全性,仅限开发环境。 3. 配置Gradle使用特定的信任设置,或者添加参数忽略证书检查。 我需要检查用户提供的引用,特别是引用[4]和[5],其中提到了Maven的参数,如-Dmaven.wagon.http.ssl.insecure=true。但Gradle使用不同的配置方式,可能需要修改gradle.properties或构建脚本。 另外,用户可能在使用阿里云镜像或其他仓库,需要确保其证书正确。例如,引用[2]提到阿里云镜像的问题,可能需要导入其证书。 步骤一:确定Gradle使用的JDK版本。有时候IDEA会使用自带的JDK,或者用户配置了其他JDK,需要确认使用的路径,以便正确导入证书。 步骤二:导出仓库的SSL证书。例如,如果使用的是阿里云镜像,需要访问其URL,用浏览器导出证书,然后使用keytool导入到JDK的cacerts文件中。 步骤三:如果用户无法获取证书,或者需要快速解决,可以临时让Gradle忽略SSL验证。但需要注意,这不安全,只能用于测试。Gradle可以通过修改构建脚本或在命令行添加参数来实现,例如设置系统属性。 此外,引用[5]中提到的Maven参数,如-Dmaven.wagon.http.ssl.insecure=true,但在Gradle中可能需要不同的参数。例如,在gradle.properties中添加系统属性,或者在命令行中使用-Dorg.gradle.wrapper.ssl.insecure=true之类的参数,但需要确认Gradle是否支持这些参数。 另一个可能性是Gradle的Wrapper配置,可能需要调整gradle-wrapper.properties文件中的分发URL,使用HTTP而非HTTPS,但这也不推荐,因为不安全。 需要验证这些方法的可行性,并确保步骤正确。例如,导入证书到正确的JDK的cacerts,确保Gradle使用的是该JDK。此外,用户可能不知道如何导出证书,可能需要指导他们如何通过浏览器获取证书文件。 最后,提醒用户生产环境中应避免禁用SSL验证,而应该正确配置证书。总结各种方法,按优先级排序,先推荐导入证书,再考虑临时方案。</think>### 解决 IntelliJ IDEA 中 Gradle 的 `PKIX path building failed` 问题问题通常因 Gradle 无法验证远程仓库(如 Maven Central、阿里云镜像等)的 SSL 证书链引起。以下是具体解决方案: --- #### 1. **确认 Gradle 使用的 JDK 路径** Gradle 默认使用 IntelliJ IDEA 配置的 JDK,需确保证书导入到正确的 JDK 信任库中: 1. 打开 **File > Project Structure > SDK Location**。 2. 记录当前项目使用的 JDK 路径(例如:`C:\Program Files\Java\jdk-11.0.15`)[^1]。 --- #### 2. **将缺失的证书导入 JDK 信任库** 以阿里云镜像仓库 (`https://maven.aliyun.com`) 为例: 1. **导出证书**: - 用浏览器访问 `https://maven.aliyun.com`。 - 点击地址栏的锁图标 > **证书** > **详细信息** > **复制到文件**,保存为 `.cer` 文件(如 `aliyun.cer`)。 2. **导入证书**: ```bash keytool -importcert -noprompt -trustcacerts \ -alias aliyun_maven \ -file "C:\path\to\aliyun.cer" \ -keystore "C:\Program Files\Java\jdk-11.0.15\lib\security\cacerts" \ -storepass changeit ``` - 替换 `jdk-11.0.15` 为实际 JDK 版本。 - 默认密码为 `changeit`[^4]。 --- #### 3. **临时绕过 SSL 验证(仅限开发环境)** 若无法获取证书,可临时禁用 Gradle 的 SSL 验证: 1. **修改 `gradle.properties`**: ```properties systemProp.javax.net.ssl.trustStore=/ systemProp.javax.net.ssl.trustStoreType=Windows-ROOT # Windows 系统信任库 systemProp.javax.net.ssl.trustStorePassword= # 或直接禁用证书检查(不推荐) systemProp.javax.net.ssl.trustAnchors=true systemProp.javax.net.ssl.disableHostnameVerification=true ``` 2. **通过命令行参数**: ```bash ./gradlew build -Djavax.net.ssl.trustStore= -Djavax.net.ssl.trustStoreType=Windows-ROOT ``` --- #### 4. **配置 Gradle 使用 HTTP 协议(不推荐)** 若仓库支持 HTTP,可修改仓库 URL(仅限内网或非敏感场景): ```groovy // build.gradle repositories { maven { url "http://maven.aliyun.com/repository/public" } } ``` --- #### 5. **更新 Gradle 或 JDK 版本** 旧版本的 Gradle/JDK 可能因 SSL 协议过时而失败: 1. 升级至 **Gradle 7.6+**(支持 TLS 1.3)。 2. 使用 **JDK 11+**,确保信任库包含最新根证书[^2]。 --- ### 总结 | 方法 | 适用场景 | 安全性 | |--------------------|----------------------------|-------| | 导入证书到 JDK | 长期稳定使用 | 高 | | 禁用 SSL 验证 | 临时调试 | 低 | | 使用 HTTP 协议 | 内网非敏感环境 | 极低 | **优先推荐方法 2(导入证书)**,确保安全性与兼容性。若问题持续,检查网络代理是否篡改证书链[^3]。 --- ### 相关问题 1. 如何在 Gradle 中强制使用特定 JDK 的信任库? 2. 如何为 Gradle 配置多个私有仓库并管理其证书? 3. 企业内网如何搭建受信的私有 Maven 仓库避免 SSL 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值