当我尝试使用SBT时,某些文件无法下载,并出现以下错误:
服务器访问错误:sun.security.validator.ValidatorException:PKIX 路径构建失败: sun.security.provider.certpath.SunCertPathBuilderException:无法 找到所请求目标的有效证书路径 URL = https://repo1.maven.org/maven2/org/scala-sbt/sbt/1.0.0-M4/sbt-1.0.0-M4.jar
我已经对Stack Overflow提出了一些建议,并使用java keytool导入了公司代理SSL证书,如下所述: SSL certificate problem in a web service proxy
它似乎不会影响SBT工具。它是否在不同的密钥库中查找?有什么想法吗?
如果我将URL粘贴到浏览器上,则会下载该文件。
在运行我安装的SBT工具时出现此错误。当我尝试在IntelliJ Idea上创建一个SBT项目并更新它时,它会给我带来不同URL的相同错误。尝试使用lightbend激活器时也是如此。
答案 0 :(得分:5)
所以当你在代理后面并且我们需要将代理服务器证书添加到java信任库时会发生这种情况
cp $JAVA_HOME/jre/lib/security/cacerts <some accessible dir>/
# Get the certificate of the proxy server and store it in a file-proxy.pem
keytool -keystore caerts -import -file proxy.pem -alias my_proxy
# Now we can invoke sbt with following config
sbt "-Djavax.net.ssl.trustStore=/path/to/included/proxycert/cacerts" compile
答案 1 :(得分:3)
如果我没记错的话,SBT间接使用了旧版本的apache commons httpclient(3.1),它默认不遵守指定信任库的java系统属性。
我可以想到三种可能的解决方案:
使用artifactory之类的代理存储库,以便SBT只需连接到代理,代理就可以通过公司代理向外处理https。
将公司颁发证书安装到JVM的默认信任库中(通常为%JDK_HOME%/jre/lib/security/cacerts
)。每次运行新的JRE时都必须这样做。
尝试使用coursier。它是SBT的一个插件,它提供了一种不同的方式来获取不通过apache httpclient的依赖项。它使用一个http库,我认为应该尊重truststore的java系统属性。它也快得多。
答案 2 :(得分:1)
这解决了这个问题:
添加-Djavax.net.ssl.trustStore =&#34; C:\ Program Files \ Java \ jre1.8.0_121 \ lib \ security \ cacerts&#34;到sbt配置文件(sbtconfig)。
如果使用IntelliJ Idea,请单击&#34; SBT设置&#34; - &GT; JVM选项 - &gt; VM参数并添加相同的行。
路径是驻留在JDK路径上的cacerts文件的路径 - &gt; lib - &gt;安全。
必须使用密钥库工具导入代理证书,如下所述:SSL certificate problem in a web service proxy
答案 3 :(得分:0)
如果使用过时的Java版本,也会发生此错误。使用Java版本1.8.0_45-b14时出现此错误。更新到Java版本11.0.2 + 7(2018-10-16)为我解决了此问题。
仅供参考,我得到的完整错误消息是:
[错误] typesafe-ivy-releases:无法获取com.geirsson#sbt-scalafmt; 1.6.0-RC4的资源:res = {https://repo.typesafe.com/typesafe/ivy-releases/com.geirsson/sbt-scalafmt/1.6.0-RC4/jars/sbt-scalafmt.jar:javax.net.ssl.SSLHandshakeException:sun.security .validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到到请求目标的有效认证路径
切换到较新的Java版本可立即解决该问题。
答案 4 :(得分:0)
在MacOS上,我通过使用sbt
运行sudo
命令解决了这个问题。
答案 5 :(得分:0)
假设您在 windows 下,当然您可以正确配置:
C:\Program Files (x86)\sbt\conf\sbtconfig.txt
-Djavax.net.ssl.trustStore=C:\\Windows\\win.ini
-Djavax.net.ssl.trustStoreType=Windows-ROOT
那你用的是IntelliJ,你可以把这些参数加到你sbt项目设置的“VM参数”中。