scala sbt and corporate proxy - SunCertPathBuilderException

2022-09-02 10:04:33

当我尝试使用SBT时,无法下载某些文件,并出现以下错误:

服务器访问错误:sun.security.validator.Validator异常: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证书,如中所述: Web服务代理中的SSL证书问题

它似乎不会影响 SBT 工具。它是否在不同的密钥库中查找?有什么想法吗?

如果我将 URL 粘贴到浏览器上,文件将下载。

当我简单地运行已安装的SBT工具时,我会收到此错误。当我尝试在IntelliJ Idea上创建一个SBT项目并更新它时,它会给我一个不同的URL相同的错误。尝试使用光弯激活剂时也是如此。


答案 1

因此,当您在代理后面并且我们需要将代理服务器证书添加到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 cacerts -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

答案 2

如果我没记错的话,SBT间接使用了旧版本的apache commons httpclient(3.1),默认情况下,它不尊重java系统属性来指定信任库。

我可以想到三种潜在的解决方案:

  1. 使用像工件这样的代理存储库这样SBT只需要连接到代理,代理就可以通过公司代理向外处理https。

  2. 将企业颁发证书安装到 JVM 的缺省信任库中(通常)。每次运行新的 JRE 时都必须执行此操作。%JDK_HOME%/jre/lib/security/cacerts

  3. 尝试使用库尔西耶。它是SBT的一个插件,它提供了一种不同的获取依赖项的方式,而不通过apache httpclient。它使用一个http库,我认为它应该尊重信任库的java系统属性。它也快得多。