Gradle同步时出现sun.security.validator.ValidatorException问题求助
解决Gradle同步的PKIX证书路径异常问题
这个sun.security.validator.ValidatorException异常我之前也碰到过好几次,本质就是你的本地JVM不信任Maven仓库的SSL证书,或者代理服务器拦截了请求导致证书验证失败。结合你的情况,给你几个可行的解决步骤:
一、长期最优方案:手动导入缺失的SSL证书到JVM信任库
这是最稳妥的解决方式,能彻底解决证书信任问题:
- 下载仓库的SSL证书:
- 分别访问你的项目用到的仓库地址:
https://maven.google.com、https://jcenter.bintray.com、https://maven.fabric.io/public - 用浏览器导出证书:点击地址栏的锁图标 → 「证书」→ 「详细信息」标签页 → 「复制到文件」,选择DER编码格式保存。
- 分别访问你的项目用到的仓库地址:
- 找到JVM的信任库文件:
- 如果你用的是Android Studio自带的JDK,路径一般是
你的Android Studio安装目录/jbr/lib/security/cacerts - 如果是本地独立JDK,路径是
JDK安装目录/jre/lib/security/cacerts
- 如果你用的是Android Studio自带的JDK,路径一般是
- 用keytool导入证书:
打开终端,执行以下命令(替换括号里的内容):
重复这个命令,把jcenter和fabric仓库的证书也导入进去。默认的cacerts密码是keytool -import -alias google-maven -keystore "你的cacerts文件路径" -file "刚才下载的google仓库证书路径"changeit,输入密码后确认导入即可。
二、代理环境下的针对性解决
如果你是在公司代理网络下开发,大概率是代理的证书没被JVM信任:
- 配置Gradle代理:
在项目根目录创建或修改gradle.properties文件,添加代理配置:systemProp.http.proxyHost=你的代理服务器IP systemProp.http.proxyPort=代理端口 systemProp.https.proxyHost=你的代理服务器IP systemProp.https.proxyPort=代理端口 # 如果代理需要账号密码,添加下面两行 systemProp.http.proxyUser=代理用户名 systemProp.http.proxyPassword=代理密码 - 导入代理的根证书:
把公司代理的根证书导出,然后用上面的keytool命令导入到JVM的cacerts文件里。
三、临时调试方案(不推荐生产环境使用)
如果只是临时想同步项目,可以禁用SSL证书校验,修改你的项目级build.gradle:
buildscript { repositories { jcenter() google() maven { url 'https://maven.fabric.io/public' allowInsecureProtocol = true } } dependencies { classpath 'com.android.tools.build:gradle:3.1.2' classpath 'io.fabric.tools:gradle:1.+' classpath 'com.google.gms:google-services:4.0.1' } } allprojects { repositories { mavenCentral() google() jcenter { allowInsecureProtocol = true } } }
注意:这个方法会跳过SSL证书验证,存在安全风险,只适合临时调试。
另外,我注意到你提供的项目级Gradle配置是截断的,上面的代码是补全后的完整示例,你可以参考调整,确保classpath依赖版本和App级配置兼容。
内容的提问来源于stack exchange,提问作者Sanjay Kumar
相关产品推荐
相关产品推荐

