AWS CodeBuild私有网络中Gradle配置代理后无法访问网络SSL报错问题
问题根因
报错由两个原因叠加导致:
- Gradle Wrapper下载自身发行包的阶段优先级高于项目内
.gradle/gradle.properties的加载,代理配置还未生效就发起了公网请求 - 私有网络的代理使用自签发SSL证书解密HTTPS流量,Java默认信任库没有该证书导致SSL握手失败
解决方案
1. 调整代理配置生效时机,确保Wrapper阶段能读取到
Gradle Wrapper执行时会优先读取环境变量和自身配置文件的参数,选择任意一种方式配置即可:
- 方式一:在CodeBuild构建脚本最前端注入
GRADLE_OPTS环境变量export GRADLE_OPTS="-Dhttps.proxyHost=<https-proxy-host> -Dhttps.proxyPort=<https-proxy-port> -Dhttp.proxyHost=<http-proxy-host> -Dhttp.proxyPort=<http-proxy-port> -Dhttp.nonProxyHosts=localhost|127.0.0.1" - 方式二:把代理配置写入
gradle/wrapper/gradle-wrapper.properties(Wrapper专属配置文件,加载优先级更高)
在该文件末尾追加以下内容:systemProp.https.proxyHost=<https-proxy-host> systemProp.https.proxyPort=<https-proxy-port> systemProp.http.proxyHost=<http-proxy-host> systemProp.http.proxyPort=<http-proxy-port> systemProp.http.nonProxyHosts=localhost|127.0.0.1 - 方式三(可选,无公网需求最优解):把
gradle-6.8.3-bin.zip上传到内部私有存储,修改gradle/wrapper/gradle-wrapper.properties里的distributionUrl参数为内部地址,完全绕过公网下载需求。
2. 导入代理自签证书到Java信任库
PKIX路径构建失败的核心是Java不信任代理的自签证书,在构建脚本中执行以下命令导入证书:
# 先导出代理的根证书,替换<proxy-host> <proxy-port>为你的代理地址端口 openssl s_client -connect <proxy-host>:<proxy-port> -showcerts < /dev/null | openssl x509 -outform PEM > proxy-ca.crt # 导入证书到Java默认信任库,AWS Ubuntu 5.0标准镜像默认信任库密码为changeit sudo keytool -importcert -file proxy-ca.crt -alias proxy-ca -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit -noprompt
3. CodeBuild场景优化(可选)
可以提前把代理证书导入到基础镜像中,推送到ECR后使用自定义镜像执行构建,减少每次构建的证书导入耗时;也可以直接在CodeBuild项目的环境变量配置页提前配置GRADLE_OPTS,避免每次构建都重复写入。
以上配置完成后再执行./gradlew clean build即可正常执行。
内容的提问来源于stack exchange,提问作者SlimenTN
相关产品推荐
相关产品推荐

