问题
在 Android 打包下载 Gradle 是出现异常
堆栈信息
Exception in thread "main" javax.net.ssl.SSLHandshakeException:
sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1937)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1478)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:212)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:969)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:904)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1050)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1363)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1391)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1375)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.http.HttpURLConnection.followRedirect0(HttpURLConnection.java:2661)
at sun.net.www.protocol.http.HttpURLConnection.followRedirect(HttpURLConnection.java:2583)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1769)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1440)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
at org.gradle.wrapper.Download.downloadInternal(Download.java:78)
at org.gradle.wrapper.Download.download(Download.java:63)
at org.gradle.wrapper.Install$1.call(Install.java:68)
at org.gradle.wrapper.Install$1.call(Install.java:48)
at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:69)
at org.gradle.wrapper.Install.createDist(Install.java:48)
at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:107)
at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:63)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
at sun.security.validator.Validator.validate(Validator.java:260)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1460)
... 22 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:145)
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:131)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
... 28 more
解决
1、下载证书
看日志这是 gradle 下载地址
https://services.gradle.org/distributions/gradle-6.5.1-bin.zip
在浏览器访问 https://services.gradle.org/distributions/
地址,下载证书
2、导入证书
- 查看已有证书
keytool -list -keystore “jdk 路径下的\lib\security\cacerts” > keystore-info.log
例如:
keytool -list -keystore “D:\AndroidStudioLatest\java11\install\lib\security\cacerts” > keystore-info.log
注意:
查看和导入证书都需要输入密钥库口令,如果你未曾设置过,默认口令是:changeit
- 导入指定证书
keytool -import -keystore “jdk 路径下的\security\cacerts” -file “证书路径”
例如:
keytool -import -keystore “D:\AndroidStudioLatest\java11\install\lib\security\cacerts” -file “C:\Users\QAQ\Downloads\gradle.org.crt”
我发现我本地不同 jdk 版本之间有一个细微的差异:
jdk 11:D:\AndroidStudioLatest\java11\install
\lib\security\cacerts
jdk 1.8:C:\Program Files\Java\jdk1.8.0_40\jre\lib\security\cacerts
总之都在 jdk 目录下,找不到时找其他或许能发现
3、检查证书是否导入
在导入证书前,我们先使用查看获取一份已有证书
在导入证书后,再获取一份已有证书
通过对比证书的 SHA-256 是否存在证书列表里判断导入证书成功与否
至此,重新打包问题不再出现了!
如果不行,重启一次 Android studio
其他解决方式
如果你不想上面那么‘复杂’的操作,你可以直接在gradle/wrapper/gradle-wrapper.properties
更换 gradle 镜像地址即可,快速便捷
- 腾讯 gradle 镜像
distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-6.5.1-bin.zip
- 华为 gradle 镜像
distributionUrl=https://mirrors.huaweicloud.com/gradle/gradle-6.5.1-bin.zip
如果更换镜像不行,最好还是根据上述配置证书,并且重启 Android studio