【问题标题】:Issue with CACERTS IntelliJ + GradleCACERTS IntelliJ + Gradle 的问题
【发布时间】:2018-07-10 18:02:17
【问题描述】:

我目前正在代理后面运行一些 REST 调用,因此我需要遵循一些严格的流程才能使调用通过。

以前我在 Eclipse 中构建 POC,但现在我知道它可以工作,我正在尝试将它与 Gradle 一起转移到 IntelliJ(个人最喜欢的 IDEA)以实现构建自动化。

我让项目编译、导出所有依赖项等...但是当我在 IntelliJ 中运行它时,我收到“未找到证书错误”。然而,附带说明一下,如果我使用“java-jar MyJar.jar”执行编译的 Jar 文件(来自 gradle),它会完美运行并且不会引发 cert 错误。这里的关键是,如果我只使用 IntelliJ 之外的 gradle 任务执行 Jar,它可以工作,但如果我尝试在 IntelliJ 中构建后立即执行任务,它会失败。

作品:

  • 通过 CLI 手动执行从 Gradle 构建任务创建的 jar
  • 使用“gradle runMain”VIA CLI 执行下面的 gradle 任务

不起作用: - 在 IntelliJ 中执行构建任务并在构建任务结束时调用“runMain”

我目前的理论是,通过 java -jar 和 gradle runMain 运行它会导致 JVM 使用默认的 cacerts“/jre_xxx/libs/security/cacerts”(我已经添加了证书)但是当我执行带有 Gradle 的 IntelliJ 中的 Jar,它使用不同的位置。我还将证书添加到“C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2018.1.5\jre64\lib\security\cacerts”,但在 IntelliJ 中运行它时仍然收到此错误。

task(runMain, dependsOn: 'classes', type: JavaExec) {
     main = 'com.xxx.xx.x.Utopia'
     classpath = sourceSets.main.runtimeClasspath
     args=[
             "-Djavax.net.ssl.trustStore=C:\\ProgramFiles\\Java\\jre1.8.0_121\\lib\\security\\cacerts"
     ]
 }

运行这个 VIA CLI 似乎可以工作,但在 IntelliJ 中无法使用 Gradle 构建任务。

任何帮助将不胜感激。

编辑:我只在 IntelliJ 中运行它时遇到的错误(PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效认证路径)

【问题讨论】:

  • 下载和安装根证书有帮助吗?
  • 我已经使用 java keytool 下载并安装了根证书,并使用密钥资源管理器验证它确实存在。基本上它可以在 IntelliJ 之外运行,但是如果我尝试在 IntelliJ 中运行 gradle(build 或 runMain),我会收到证书错误,这让我认为 IntelliJ 没有使用正确的 cacerts。
  • 我收到一封来自 JetBrains 支持的电子邮件,表明最上面的证书是问题所在。如果您拥有正确的证书,IntelliJ 会正确执行此操作。我在 Gradle b/c 上遇到了这个问题,我没有最高证书。单击证书路径而不是详细信息复制到文件。
  • 您建议我将最顶层的证书添加到默认的 Java CACERT (jre_xxx/lib/security) 还是应该将其添加到 IntelliJ/jre64/lib/security.cacert 的 IntelliJ?跨度>
  • 编辑:我添加了最顶层的证书,我获得了最高的树值并将其添加到两个 cacerts 但我仍然收到完全相同的问题。

标签: java gradle intellij-idea javaexec-gradle-plugin


【解决方案1】:

在就我的问题联系 JetBrains 支持后,我得知了该问题。从逻辑上讲,我假设 JRE 会执行 JAR 文件,只有在运行 java -jar my.jar 或从 CLI 执行 Gradle 时才会出现这种情况。 IntelliJ 的工作方式是它只使用 JDK,所以我不得不修改 JDK 中的小型 JRE。一旦我这样做并将其添加到我的 jdk.xxx/jre/lib/security/cacerts 中的 CACERTS 中,我就能够解决这个问题。

https://youtrack.jetbrains.com/issue/IDEA-195428

【讨论】:

  • 非常感谢,我不知道为什么它只有 1 票。这为我节省了大量时间。
  • 使用“选择运行时”来选择客户运行时(带有预加载的证书)对我不起作用,因为当我这样做时,intellij 首选项对话框不起作用。我希望有一个“intellij cacerts”插件。那不是很棒吗?
【解决方案2】:

如果有人也遇到这个问题。我已将我的证书添加到 JDK 商店并确保 IntelliJ 正在使用 JDK,但是在尝试下载 JAR 时它仍然会失败。结果我不得不杀死在后台运行的 gradle 守护进程,因为它在 IntelliJ 重新启动之间持续存在。我在 Windows 上,所以 ps java | kill 在 Powershell 中工作。 pkill java 可以在 Linux 中运行。

【讨论】:

    【解决方案3】:

    Ok.. 有时这可能是非常微小的事情,我们往往会忽略始终使用 jdk>jre>lib>security 文件夹中的 cacerts 文件路径进入 gradle VMOptions 设置。

    【讨论】:

      【解决方案4】:

      使用内置的 IntelliJ-IDEA 插件信任自定义证书:

      https://www.jetbrains.com/help/idea/settings-tools-server-certificates.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-05
        • 2016-12-21
        • 1970-01-01
        • 2011-11-26
        • 2015-05-06
        相关资源
        最近更新 更多