You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

企业环境下Gradle项目PKIX错误解析与解决方法咨询

企业证书导入JDK后Gradle仍报PKIX路径构建失败问题排查

问题现象

企业环境要求将内部证书导入已安装的JDK中,已完成多个JDK位置的证书导入操作,且在命令执行前及~/.bashrc中配置了正确的JAVA_HOME,但执行Gradle命令时反复出现PKIX路径构建失败错误。即使清空~/.gradle目录、移除项目中的gradlew脚本、执行gradle --stop终止守护进程后重新初始化,错误依然存在。同事使用Gradle 6.4.1版本时也遇到完全相同的问题。

错误日志

Starting a Gradle Daemon, 2 stopped Daemons could not be reused, use --status for details

FAILURE: Build failed with an exception.

* Where:
Initialization script '/Users/user/.gradle/init.gradle' line: 2

* What went wrong:
A problem occurred evaluating root project 'some-project'.
> Could not get resource 'https://nexus.our.corp.domain/repository/raw-hosted/gradle/vx.x.x/service.gradle'.
   > Could not GET 'https://nexus.our.corp.domain/repository/raw-hosted/gradle/vx.x.x/service.gradle'.
      > The server may not support the client's requested TLS protocol versions: (TLSv1.2, TLSv1.3). You may need to configure the client to allow other protocols to be used. See: https://docs.gradle.org/7.5.1/userguide/build_environment.html#gradle_system_properties
         > PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

init.gradle内容

gradle.allprojects {
    ext.use_script = { name -> apply from: "$scripts_repo/${name}.gradle" }
}

Gradle版本信息

gradle --version

------------------------------------------------------------
Gradle 7.5.1
------------------------------------------------------------

Build time:   2022-08-05 21:17:56 UTC
Revision:     d1daa0cbf1a0103000b71484e1dbfe096e095918

Kotlin:       1.6.21
Groovy:       3.0.10
Ant:          Apache Ant(TM) version 1.10.11 compiled on July 10 2021
JVM:          11.0.17 (Amazon.com Inc. 11.0.17+8-LTS)
OS:           Mac OS X 10.16 x86_64

已尝试的操作

  • 导入证书到多个JDK的cacerts存储:
    JAVA_HOME=/usr/local/Cellar/openjdk@8/1.8.0+352 keytool -importcert -file /path/to/certs/corp-cert -alias Root -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit
    
    JAVA_HOME=/usr/local/Cellar/openjdk@11/11.0.16.1_1 keytool -importcert -file /path/to/certs/corp-cert -alias Root -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit
    
    export JAVA_HOME=`/usr/libexec/java_home -v 11.0.13`; echo "JAVA_HOME-contents: ${JAVA_HOME}"; keytool -importcert -file /path/to/certs/corp-cert -alias Root -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit
    
    JAVA_HOME=$HOME/.sdkman/candidates/java/11.0.17-amzn keytool -importcert -file /path/to/certs/corp-cert -alias Root -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit
    
  • 完全移除~/.gradle目录及项目中的gradlew脚本后重新操作
  • 清理sdkman残留后重新安装Java 11.0.17-amzn

原因分析

  1. Gradle守护进程缓存残留:即使执行gradle --stop,部分守护进程可能未彻底终止,仍在使用旧的JDK环境或证书缓存
  2. 证书导入不完整/无效:仅导入根证书但缺失中间证书,导致证书链断裂;或导入时别名冲突覆盖了原有证书;或证书格式不匹配(如PEM格式未转换为DER)
  3. Gradle信任存储优先级问题:Gradle可能未使用JDK的cacerts,而是读取系统级密钥链(如macOS的钥匙串),或通过系统属性指定了其他信任存储
  4. macOS特殊环境影响:macOS系统密钥链的优先级可能高于JDK的cacerts,未将证书导入系统密钥链导致验证失败

解决/规避方案

方案1:强制Gradle使用指定的信任存储

执行Gradle命令时显式指定JVM参数,强制使用已导入证书的cacerts:

./gradlew build -Djavax.net.ssl.trustStore=$JAVA_HOME/lib/security/cacerts -Djavax.net.ssl.trustStorePassword=changeit

或把参数写入~/.gradle/gradle.properties文件,永久生效:

systemProp.javax.net.ssl.trustStore=/path/to/your/jdk/lib/security/cacerts
systemProp.javax.net.ssl.trustStorePassword=changeit

方案2:彻底清理Gradle守护进程

# 停止所有Gradle守护进程
gradle --stop
# 强制杀死残留的守护进程
pkill -f "GradleDaemon"
# 删除对应版本的守护进程缓存目录
rm -rf ~/.gradle/daemon/7.5.1/

方案3:验证并完善证书导入

先验证证书是否成功导入目标JDK:

keytool -list -keystore $JAVA_HOME/lib/security/cacerts -alias Root -storepass changeit

若提示“别名不存在”,重新导入时注意:

  • 确认证书格式:如果是PEM格式,需先转换为DER格式,或导入时添加-storetype PKCS12参数
  • 若Nexus使用中间证书签名,需同时导入根证书和中间证书,确保证书链完整

方案4:处理macOS系统密钥链影响

  • 打开“钥匙串访问”,将企业证书拖入“系统”钥匙串,右键证书选择“显示简介”,在“信任”选项卡设置为“始终信任”
  • 或修改JDK的java.security文件(路径:$JAVA_HOME/conf/security/java.security),调整安全提供者顺序,让JDK的cacerts优先(不推荐,可能影响其他Java应用)

方案5:临时禁用SSL验证(仅用于排查,禁止生产环境使用)

在init.gradle开头添加以下代码,临时绕过SSL验证,确认是否为证书问题:

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

def trustAllCerts = [new X509TrustManager() {
    public X509Certificate[] getAcceptedIssuers() { return null }
    public void checkClientTrusted(X509Certificate[] certs, String authType) {}
    public void checkServerTrusted(X509Certificate[] certs, String authType) {}
}]

def sc = SSLContext.getInstance("TLS")
sc.init(null, trustAllCerts, new java.security.SecureRandom())
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory())
HttpsURLConnection.setDefaultHostnameVerifier({ hostname, session -> true })

内容的提问来源于stack exchange,提问作者biboti6045

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 14:55:22