17

我在使用自己的证书重写 TLS 流量的公司防火墙 (Zscaler) 后面。

当我尝试在 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

我还需要做其他事情吗?

4

6 回答 6

6

企业颁发的证书需要包含在 Gradle 使用的信任库中。对此进行故障排除可能很困难,尤其是在您安装了多个 Java 版本和 JRE 的情况下。首先要确定的是 JRE Gradle 使用的是什么。有一个答案指出问题已通过使用 Gradle Wrapper 得到解决。Gradle Wrapper调用在 gradle.properties 中定义的项目特定 Java 环境。默认情况下,它设置为distributionBase=GRADLE_USER_HOME。要让 Gradle 使用不受信任的证书进行构建,可以按照文档中的说明进行操作

HTTP 构建缓存后端的 SSL 证书可能不受信任,因为它是内部配置的或自签名证书。

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

允许与不受信任的服务器通信可在传输过程中保持数据加密,但使中间人更容易冒充目标服务器并捕获数据。

最好将证书导入 Gradle 使用的 JVM,这看起来就像您尝试做的那样。如果您希望 IntelliJ 了解公司证书,您可以通过 UI 导航到设置 > 工具 > 服务器证书来导入这些证书。导入您的组织颁发的证书文件并重试构建。

于 2019-09-17T14:05:45.697 回答
3

大多数情况下,它可能与证书有关。要验证这一点,删除该选项 accepted certificates并选中“自动接受不受信任的证书”可能会解决问题。正如@Colm Bhandal 评论的那样,这不是一个解决方案,而是一个解决方案。

在此处输入图像描述

于 2020-02-05T07:45:14.243 回答
1

修复:将 ZScaler 根证书放入 IJ

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

那应该这样做。

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

更详细的讨论

这似乎是 IntelliJ (IJ) 的一个普遍问题,不仅仅是 Gradle 任务,而是当 IJ 尝试连接到任何 HTTPS 站点时,正如该用户的评论所指出的那样:

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

扩展该评论​​,我们从JetBrains 文档中注意到:

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

现在,从那个 JetBrains 文档和这个答案中,一种可行的方法是简单地自动接受所有不受信任的证书。为了理解为什么这是一个好的方法,我们记得整个问题首先是由 ZScaler 背后产生的。由于您支持 ZScaler,因此您可以相信拦截您所有请求的 ZScaler 中间服务器将为您阻止任何不可信的站点,因此您无需担心在 IJ 中。换句话说,当 ZScaler 将这些证书转发给 IJ 时,您已经可以信任它们了。

但是,当您的组织允许您禁用 ZScaler 时,就会出现这种方法的问题。在这种情况下,如果您禁用 ZScaler,那么您将不再受到它的保护。当你这样做时,你会记得恢复你的 IJ 设置吗?也许吧,但这样做会是一个可怕的手动负担。更有可能的是,您可能不记得了,然后您的 IJ 可能会连接到不可信的站点。我不知道完整的安全细节,所以也许采取了一些其他措施来缓解这种漏洞,但在我看来,这似乎是一个漏洞。例如,攻击者可以设置一个虚假的更新站点来更新您的一个 IntelliJ 插件,并安装一个恶意插件,而您甚至都不知道。现在你'

所以更安全的方法是找到问题的根源,从字面上看:找到 ZScaler 根证书并将其添加到 IJ 信任库。然后 IJ 可以信任该证书,以及 ZScaler 在拦截您的流量时发布的任何下游证书。

为什么是根证书?

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

笔记

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

于 2021-06-04T10:16:37.993 回答
0

我还需要做其他事情吗?

很可能是。JAVA_HOME是 Gradle 用来选择 Java 来执行它的变量。一旦您拥有 Java 及其包含所需证书的信任库,请尝试设置JAVA_HOME到该目录。

于 2020-08-27T07:34:29.137 回答
0

我将设置更新为Auto Import Certificate,它对我有用

Settings -> Tools -> Server Certificates -> Check the box for auto import
于 2019-09-10T11:17:56.140 回答
0

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

关键操作是gradlew.bat在终端选项卡中运行。

于 2021-01-28T11:31:27.223 回答