如何为Android Studio嵌入式Java添加自定义证书及解决导入失效问题
问题背景
公司使用自有制品仓库,需导入专属证书才能下载依赖。默认配置下运行项目会出现如下错误:
Could not resolve all files for configuration ':classpath'.
Could not download gradle-7.2.0.jar (com.android.tools.build:gradle:7.2.0)
Could not get resource 'https://artifactory.tcloud.company.int/artifactory/maven-all/com/android/tools/build/gradle/7.2.0/gradle-7.2.0.jar'.
Could not GET 'https://artifactory.tcloud.company.int/artifactory/maven-all/com/android/tools/build/gradle/7.2.0/gradle-7.2.0.jar'.
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.
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
临时方案是替换Android Studio的JBR文件夹为已导入证书的本地JDK,但这并非最优解。尝试导入证书到JBR、设置STUDIO_JDK环境变量均未生效。
为什么导入JBR证书无效?
- Gradle独立使用JVM:Android Studio的JBR是给IDE本身用的,而Gradle构建过程会单独使用自己配置的JDK(可能是项目指定的、Gradle嵌入式的,或者系统默认的),两者不是同一个运行环境,所以给JBR导入证书对Gradle无效。
- 证书导入路径错误:如果导入时找错了JBR的cacerts文件路径(正确路径是
Android Studio\jbr\lib\security\cacerts),或者密钥库密码输入错误(默认是changeit),都会导致证书没真正导入成功。 - STUDIO_JDK仅作用于IDE:设置STUDIO_JDK只会让IDE本身使用指定JDK,但Gradle构建不受这个环境变量影响,依旧用自己的JVM配置。
正确的配置方法
方法1:给Gradle使用的JDK导入证书
首先确定Gradle当前使用的JDK:
- 打开Android Studio,进入
File > Project Structure > SDK Location,查看Gradle JDK的路径; - 或者查看项目根目录的
gradle.properties文件,看是否有org.gradle.java.home配置项。
然后用keytool命令导入证书:
keytool -importcert -file /绝对路径/到/你的证书文件.crt -keystore /GradleJDK路径/lib/security/cacerts -alias company-artifactory-cert
执行命令后输入密钥库默认密码changeit,确认导入即可。
方法2:让Gradle直接使用已导入证书的本地JDK
在项目根目录的gradle.properties中添加以下配置,指定Gradle使用带证书的本地JDK:
org.gradle.java.home=/本地JDK的绝对路径
或者在Android Studio中手动设置:
进入File > Settings > Build, Execution, Deployment > Build Tools > Gradle,在Gradle JDK下拉框中选择已导入证书的本地JDK,点击应用。
方法3:给Gradle仓库直接配置信任证书(无需修改JDK)
如果不想修改JDK的证书库,可以直接在项目的Project级build.gradle中给仓库配置信任证书:
buildscript { repositories { maven { url "https://artifactory.tcloud.company.int/artifactory/maven-all" // 如果仓库需要账号密码,添加以下配置 // credentials { // username = "你的仓库账号" // password = "你的仓库密码" // } ssl { // 使用单独的信任库文件(可自行用keytool生成) trustStore file("/路径/到/你的信任库.jks") trustStorePassword "信任库密码" } } } // ...其他buildscript配置 } allprojects { repositories { maven { url "https://artifactory.tcloud.company.int/artifactory/maven-all" ssl { trustStore file("/路径/到/你的信任库.jks") trustStorePassword "信任库密码" } } // ...其他仓库配置 } }
内容的提问来源于stack exchange,提问作者Kira Resari

