Kotlin Multiplatform项目构建失败:代理环境下无法解析com.github.webassembly:binaryen依赖(SSL握手异常)
Kotlin Multiplatform项目构建失败:代理环境下无法解析com.github.webassembly:binaryen依赖(SSL握手异常)
看起来你遇到的是企业代理环境里的典型问题——普通Gradle依赖能正常走代理,但像binaryen这类工具类的依赖(由kotlinBinaryenSetup任务负责拉取),因为JVM没信任代理的SSL证书,导致SSL握手失败,进而触发PKIX路径构建错误。
给你几个针对性的解决办法,按推荐程度排序:
1. 导入企业代理证书到Gradle使用的JVM证书库(最彻底)
企业代理通常会替换HTTPS请求的证书,而Gradle用的JVM默认不信任这个代理证书,所以得手动导入:
- 第一步:找到Gradle使用的JRE路径。如果是用Android Studio自带的JDK,MacOS路径大概是
/Applications/Android Studio.app/Contents/jbr/Contents/Home,Windows则是C:\Program Files\Android\Android Studio\jbr。 - 第二步:用
keytool命令导入代理证书(假设你已经导出了代理的根证书为proxy-cert.cer):# MacOS/Linux(需要sudo获取权限) sudo keytool -importcert -file proxy-cert.cer -keystore $JRE_HOME/lib/security/cacerts -alias proxy-ssl-cert
默认证书库密码是# Windows(以管理员身份运行命令提示符) keytool -importcert -file proxy-cert.cer -keystore "%JRE_HOME%\lib\security\cacerts" -alias proxy-ssl-certchangeit,按提示输入即可完成导入。
2. 确保Gradle代理配置覆盖所有下载场景
有时候全局代理配置没覆盖到工具类依赖的下载任务,你可以在项目根目录的gradle.properties里补全完整的代理配置:
# HTTP代理 systemProp.http.proxyHost=你的代理IP或域名 systemProp.http.proxyPort=代理端口 # HTTPS代理 systemProp.https.proxyHost=你的代理IP或域名 systemProp.https.proxyPort=代理端口 # 若代理需要认证 systemProp.http.proxyUser=你的代理账号 systemProp.http.proxyPassword=你的代理密码 systemProp.https.proxyUser=你的代理账号 systemProp.https.proxyPassword=你的代理密码 # 显式指定证书库路径(替换成你实际的JRE路径) systemProp.javax.net.ssl.trustStore=/Applications/Android Studio.app/Contents/jbr/Contents/Home/lib/security/cacerts systemProp.javax.net.ssl.trustStorePassword=changeit
3. 手动下载binaryen包,跳过自动拉取(快速临时解决)
既然你已经能通过浏览器/curl下载到binaryen的压缩包,直接手动配置本地路径就行:
- 下载对应平台的包(比如你这里是
binaryen-version_118-x86_64-macos.tar.gz),解压到本地某个目录,比如~/tools/binaryen-118 - 在项目根目录的
build.gradle.kts里添加配置,让KMP插件使用本地的binaryen:import org.jetbrains.kotlin.gradle.targets.js.binaryen.BinaryenRootExtension rootProject.extensions.configure<BinaryenRootExtension> { binaryenPath.set(file("~/tools/binaryen-118")) // 替换成你的实际解压路径 binaryenDownload.set(false) // 禁用自动下载 }
这样再重新执行构建,应该就能绕过这个SSL握手的问题了。
备注:内容来源于stack exchange,提问作者Steve Novack




