执行sbt new创建PlayFramework 2.7.x应用遇SSL证书错误求助
解决sbt创建Play Scala应用时的SSL证书依赖解析失败问题
老哥,你这情况我之前也碰到过——就是典型的SSL证书信任问题,sbt拉取依赖的时候没法验证远程仓库的SSL证书,导致握手失败,依赖自然就解析不了了。下面给你几个实用的解决办法:
1. 手动导入缺失的SSL证书到JVM信任库(最稳妥的长期方案)
错误提示里明确说找不到有效的证书路径,那咱们就把仓库的证书导入到JDK的信任存储里:
- 先打开浏览器访问Maven中央仓库或者Play插件仓库的地址,点击地址栏的锁图标,查看证书详情,然后把证书导出成
.crt格式的文件。 - 找到你当前sbt用的JDK的
cacerts文件位置,一般在$JAVA_HOME/jre/lib/security/cacerts(Windows系统路径类似,自行查找即可)。 - 用
keytool命令导入证书,命令示例如下:
注意默认的keytool -import -trustcacerts -alias maven-central -file /你下载的证书路径/certificate.crt -keystore $JAVA_HOME/jre/lib/security/cacertscacerts密码是changeit,执行时会提示输入,直接填写即可。
2. 临时跳过SSL证书校验(应急用,生产环境禁用)
要是你只是想先把项目跑起来测试,不想折腾证书导入,可以给sbt加启动参数跳过验证:
- 执行创建命令时改成:
或者更激进的方式(有安全风险,谨慎使用):sbt -Djavax.net.ssl.trustStore=/自定义信任库路径/cacerts -Djavax.net.ssl.trustStorePassword=你的密码 new playframework/play-scala-seed.g8sbt -Djavax.net.ssl.enableSNI=false -Djsse.enableSNIExtension=false new playframework/play-scala-seed.g8
3. 检查网络代理(内网环境必看)
如果是在公司内网通过代理上网,大概率是代理的SSL证书没被JVM信任:
- 先确认sbt的代理配置是否正确,可以在
~/.sbt/repositories或者~/.sbt/1.0/plugins/proxy.sbt文件中配置代理地址和端口。 - 把代理的SSL证书也导入到JDK的
cacerts里,步骤和第一个方案一致。
4. 确认sbt和JDK版本适配
虽然你说不是sbt或Play的问题,但还是提一嘴:Play 2.7.x推荐使用sbt 1.2.x及以上版本,JDK推荐8或者11,版本不匹配有时候也会引发奇怪的网络问题,不妨检查下。
总的来说,第一个方案是最靠谱的,能彻底解决问题,后面几个都是应急或者特殊场景下的临时办法。
内容的提问来源于stack exchange,提问作者sizer
相关产品推荐
相关产品推荐

