【问题标题】:How to set up Java VM to use the root certificates (truststore) handled by Mac OS X如何设置 Java VM 以使用 Mac OS X 处理的根证书(信任库)
【发布时间】:2012-12-26 04:15:56
【问题描述】:

我在使用 scribe OAuth 库时遇到以下异常。

Caused by: javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

根据一些谷歌搜索,我似乎应该以某种方式设置 JVM 信任库。

为什么我需要这样做?如何指示 Java VM 使用操作系统的默认信任库? (在我的例子中是 Mac OS X)。

【问题讨论】:

    标签: java macos ssl-certificate scribe truststore


    【解决方案1】:

    您可以使用Apple JCA Provider 将 OSX 钥匙串用作 java 信任存储。只需使用以下系统属性启动 JVM:

    -Djavax.net.ssl.trustStoreType=KeychainStore
    

    您可以使用JAVA_TOOL_OPTIONS 环境变量为每个启动的JVM 设置此属性,如hagrawal's answer 中所述。

    【讨论】:

    • 这让 Fiddler 为我工作。谢谢!
    • 这是迄今为止最好的答案。谢谢!
    • 遗憾的是,这似乎破坏了使用默认信任库文件中的证书的请求。显然它不会同时服从两者。
    【解决方案2】:

    我想大家都很清楚,JAVA在处理SSL时需要一种方法来识别默认信任库,所以这个信息已经以某种方式传递给了JAVA,所以我认为手头的“更新”问题是如何以一次做一次然后忘记每次的方式来做。

    我能找到的最好方法是在您的操作系统级别设置JAVA_TOOL_OPTIONS 环境变量,如果设置了此环境变量,则默认情况下将使用您在此环境变量中提供的参数启动 JAVA。

    因此,您无需设置 -Djavax.net.ssl.trustStore=/Library/Java/Home/lib/security/cacerts 每次启动 JVM,而是设置 JAVA_TOOL_OPTIONS 环境变量“一次”在您的操作系统级别值为 -Djavax.net.ssl.trustStore=/Library/Java/Home/lib/security/cacerts 然后你就完成了。

    以下是“进一步阅读”#1的节选:

    设置此环境变量时,JNI_CreateJavaVM 函数 (在 JNI 调用 API 中)预先设置环境的值 变量为其 JavaVMInitArgs 参数中提供的选项。

    下面只提到要注意的警告,摘自“进一步阅读”的#1:

    在某些情况下,出于安全原因禁用此选项,因为 例如,在 Solaris OS 上,当有效用户 或组 ID 与真实 ID 不同。

    下面是另一个需要注意的警告(摘自“进一步阅读”的#1),但我认为由于上下文与 VM 选择参数无关,所以它不相关,只是提一下。

    因为这个环境变量是在那个时候被检查的 JNI_CreateJavaVM 被调用,它不能用于扩充命令 与通常由启动器处理的选项一致,例如 例如,使用 -client 或 -server 选项选择 VM。

    进一步阅读:

    【讨论】:

      【解决方案3】:

      我可以通过在启动 VM 时添加此系统属性来设置默认信任库:

      -Djavax.net.ssl.trustStore=/Library/Java/Home/lib/security/cacerts
      

      我仍然不明白为什么我需要这样做。这应该是默认值。每次添加这个也很烦人。有没有更好的方法,例如一些操作系统设置?

      【讨论】:

      • 回复:“这应该是默认设置。” Java 的更新通常与主机操作系统不同步。使用单独的信任库可以让已知不安全的证书更快地不受信任以提高安全性,并允许运行在旧操作系统上的 Java 应用程序,这些操作系统本身可能不会捆绑所有现代根 CA - 以及可能没有任何系统 CA 信任库的嵌入式系统 -保持安全。类似的原因是许多浏览器绕过系统信任库的原因。事实上,Chrome 正在朝着这种模式发展,并远离系统信任库。
      【解决方案4】:

      啊!我知道这个问题。 我有类似的问题,它与 OSX 中的 Java 绑定有关。 一旦我安装了最新版本,它就得到了修复。

      https://support.apple.com/en-us/HT204036

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-11
        • 1970-01-01
        • 2013-12-20
        • 2019-02-26
        • 1970-01-01
        • 2011-01-18
        • 1970-01-01
        • 2013-01-07
        相关资源
        最近更新 更多