企业代理后面的Intellij / Gradle同步失败

时间:2018-01-23 11:54:34

标签: java gradle intellij-idea truststore zscaler

我支持企业防火墙(Zscaler),它使用自己的证书重写TLS流量。

当我尝试在intellij中创建Gradle项目时,即使将CA和中间证书导入到Intellij(通过Server Certificates设置页面)并进入每个Java信任库,我都会收到以下错误:想到。

Sync Failed
Download https://services.gradle.org/distributions/gradle-4.0-bin.zip   797ms
Cause: unable to find valid certification path to requested target

我甚至将它们导入Intellij的私人JRE,例如。

C:\Progra~1\Java\jdk1.8.0_131\bin\keytool.exe -importcert -alias zscaler_root_ca     -keystore C:\Progra~1\Java\jdk1.8.0_131\jre\lib\security\cacerts -storepass changeit -file zscaler_root_ca.crt
C:\Progra~1\Java\jre1.8.0_151\bin\keytool.exe -importcert -alias zscaler_root_ca     -keystore C:\Progra~1\Java\jre1.8.0_151\lib\security\cacerts -storepass changeit -file zscaler_root_ca.crt
"C:\Users\jonathan.bates\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\173.4301.25\jre64\bin\keytool.exe" -importcert -alias zscaler_root_ca     -keystore "C:\Users\jonathan.bates\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\173.4301.25\jre64\lib\security\cacerts" -storepass changeit -file zscaler_root_ca.crt

我还需要做其他事吗?

7 个答案:

答案 0 :(得分:1)

公司颁发的证书需要包含在Gradle使用的信任库中。对此进行故障排除可能很困难,尤其是在您安装了多个Java和JRE版本的情况下。首先要确定的是JRE Gradle使用的是什么。有一个答案指出使用Gradle Wrapper解决了该问题。 Gradle Wrapper调用在gradle.properties中定义的项目特定的Java环境。默认情况下,它设置为distributionBase=GRADLE_USER_HOME。要使Gradle使用不受信任的证书进行构建,可以遵循instructions in the documentation

  

由于是内部提供的或自签名证书,因此HTTP构建缓存后端的SSL证书可能不受信任。

     

在这种情况下,您可以将构建JVM环境配置为信任证书,也可以将此属性设置为true以禁用对服务器身份的验证。

     

允许与不受信任的服务器进行通信可以在传输过程中对数据进行加密,但是中间人可以更轻松地模拟目标服务器并捕获数据。

最好将证书导入到Gradle使用的JVM中,这看起来就像您要尝试执行的操作。如果您希望IntelliJ了解公司证书,则可以通过导航到“设置”>“工具”>“服务器证书”,通过UI导入公司证书。导入您的组织颁发的证书文件,然后重试构建。

答案 1 :(得分:1)

对我来说,它在我删除了“接受的证书”并选中“自动接受不信任的证书”后起作用了

enter image description here

答案 2 :(得分:1)

对我来说,每个设置似乎都是正确的,上面提到的检查。 我不知道为什么,但错误消息:post 消失,unable to find valid certification path to requested target 在升级项目的 Gradle Wrapper 后开始工作: https://docs.gradle.org/6.8.1/userguide/gradle_wrapper.html

关键操作是在终端选项卡中运行 gradle build

答案 3 :(得分:0)

我不确定区别是什么,但是安装Gradle,并且运行gradle wrapper似乎解决了我的问题(假设我已经将证书安装到信任库)。

答案 4 :(得分:0)

我将设置更新为Settings -> Tools -> Server Certificates -> Check the box for auto import ,它对我有用

/var/www/html/admin/vendor/nesbot/carbon/src/Carbon/Traits/Units.php

答案 5 :(得分:0)

我还需要做其他事情吗?

是的,可能是。 JAVA_HOME是Gradle用来选择要执行它的Java的变量。 一旦Java的信任库包含所需的证书,请尝试将JAVA_HOME设置为该目录。

答案 6 :(得分:0)

修复:将 ZScaler 根证书放入 IJ

  1. 打开谷歌浏览器
  2. 转到设置 -> 安全 -> 管理证书
  3. 转到“受信任的根证书颁发机构”标签
  4. 向下滚动到“ZScaler Root CA”项目 - 作为一个“Z”字,它可能靠近或位于列表底部
  5. 点击“导出...”
  6. 按照向导的步骤将您的证书导出为 .CER 文件并将其保存到您机器上的某个位置
  7. 现在打开 IntelliJ (IJ)
  8. 打开设置 (Ctrl+Alt+S)
  9. 搜索“cert”以过滤设置并转到“服务器证书”
  10. 点击小 + 图标
  11. 浏览到您刚刚保存的文件,然后在设置中再次点击“确定”和“确定”

应该可以。

注意:假设您使用 Google Chrome,ZScaler 根证书已经存储在 Chrome 的信任存储中。如果您不是这种情况,希望您能找到另一种获得 ZScaler Root 证书的方法。最坏的情况:您可以随时询问您的 IT 部门。我确定他们是管理 ZScaler 的人,应该知道如何为您获取证书。

更详细的讨论

这似乎是 IntelliJ (IJ) 的普遍问题,不仅针对 Gradle 任务,而且当 IJ 尝试连接到任何 HTTPS 站点时,正如 this user 的评论所指出的:

<块引用>

intellij 对您的终端使用不同的秘密存储。

扩展该评论​​,我们注意到 JetBrains documentation

<块引用>

IntelliJ IDEA 为可信证书提供自己的存储。

现在,根据 JetBrains 文档和 this answer,一种可行的方法是简单地自动接受所有不受信任的证书。要理解为什么这是一个不错的方法,我们回想一下整个问题最初是由 ZScaler 背后造成的。由于您支持 ZScaler,您可以相信拦截您所有请求的 ZScaler 中间服务器会为您拦截任何不可信的站点,因此您无需在 IJ 中担心。换句话说,当 ZScaler 将这些证书转发给 IJ 时,您就已经可以信任它们了。

但是,当您的组织允许您禁用 ZScaler 时,该方法就会出现问题。在这种情况下,如果您禁用 ZScaler,那么您将不再受到它的保护。当你这样做时,你会记得恢复你的 IJ 设置吗?也许吧,但这样做会是一个可怕的手动负担。更有可能的是,您可能不记得了,然后您的 IJ 可能会连接到不可信的站点。我不知道完整的安全细节,所以也许还采取了一些其他措施来缓解这种漏洞,但从表面上看,这在我看来就像一个漏洞。例如,攻击者可以建立一个虚假的更新站点来更新您的一个 IntelliJ 插件,并在您不知情的情况下安装恶意插件。现在你的机器上实际上已经感染了病毒,因为每当你运行 IJ 时,插件也会运行,并且可能会做各种各样的坏事。

因此,更安全的方法是找到问题的根源,字面意思是:找到 ZScaler 根证书并将其添加到 IJ 信任存储中。然后 IJ 可以信任该证书,以及 ZScaler 在拦截您的流量时发出的任何下游证书。

为什么是根证书?

值得一提的是,您添加的根证书与 IJ 在您遇到问题时警告您的证书不同。例如。当我尝试“检查更新”时,导致问题的证书被颁发给“*.google.com”。我相信这些只是 ZScaler 在拦截您的流量时创建的拦截器证书。 ZScaler 使用 Google 的真实证书与 Google 进行通信。 “代理”证书是 ZScaler 生成的与您的机器对话的证书。由于 ZScaler 必须为所有可以想象的站点生成这样的代理证书,因此仅将它们添加到您在 IJ 中的信任存储中是不够的。不仅如此,这些代理证书的保质期似乎也很短——我看到的那个在两周内就过期了。因此,您必须不断将它们重新添加到 IJ 信任存储中。然后 IJ 信任存储会被 ZScaler 创建的所有这些临时证书弄得乱七八糟。这就是您要添加根证书的原因。我相信它可以作为分发的任何临时代理证书的最终签名机构。而且我看到的那个20多年都没有过期。因此,我认为自己暂时不必再摆弄 IJ 设置了。

注意事项

本质上,此答案中给出的修复实际上与 this one 相同,但我正在扩展如何从 Google Chrome 设置中实际获取 ZScaler 证书,并讨论了为什么我们做我们正在做的事情,并与替代方案进行比较。