如何设置Java VM以使用Mac OS X处理的根证书(信任库)

jaxagkaj  于 2023-10-14  发布在  Java
关注(0)|答案(6)|浏览(129)

我在使用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在我的情况下)。

yvgpqqbh

yvgpqqbh1#

您可以使用Apple JCA提供程序将OSX密钥链用作Java信任存储。只需使用以下系统属性启动JVM:

-Djavax.net.ssl.trustStoreType=KeychainStore

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

s2j5cfk0

s2j5cfk02#

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

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

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

wj8zmpe1

wj8zmpe13#

我认为每个人都很清楚,在处理SSL时,JAVA需要一种方法来识别默认的信任库,因此这些信息已经以某种方式传递给JAVA,所以我认为手头的“更新”问题是如何以一种一次性然后每次都忘记的方式来完成它。
我能找到的最好的方法是在你的操作系统级别设置JAVA_TOOL_OPTIONS环境变量,如果设置了这个环境变量,那么JAVA将默认使用你在这个环境变量中提供的参数启动。

因此,您不需要每次启动JVM时都设置-Djavax.net.ssl.trustStore=/Library/Java/Home/lib/security/cacerts,只需在您的操作系统级别设置JAVA_TOOL_OPTIONS环境变量“once”,值为-Djavax.net.ssl.trustStore=/Library/Java/Home/lib/security/cacerts即可。

以下是“进一步阅读”的摘录:
设置此环境变量时,JNI_Invocation JavaVM函数(在JNI Invocation API中)将环境变量的值预先添加到其JavaVMInitArgs参数中提供的选项中。
下面是“进一步阅读”的第一部分,仅需注意:
在某些情况下,出于安全原因会禁用此选项,例如,在Solaris OS上,当有效用户或组ID与真实的ID不同时,将禁用此选项。
下面是另一个需要注意的警告(摘自“进一步阅读”的第1部分),但我认为由于上下文与VM选择参数无关,因此它不相关,但只是提一下。
由于这个环境变量是在调用JNI_JavaVM时检查的,所以它不能用于使用通常由启动器处理的选项来增加命令行,例如,使用-client或-server选项的VM选择。

更多阅读:

noj0wjuj

noj0wjuj4#

我知道这个问题。我也有类似的问题,这与OSX中的Java绑定有关。当我安装了最新版本后,它得到了修复。
https://support.apple.com/en-us/HT204036

t3irkdon

t3irkdon5#

要使Java使用macOS密钥链,请将以下参数传递给Java VM:

-Djavax.net.ssl.trustStoreType=KeychainStore

然而,Apple JCE提供程序(处理密钥链访问)或macOS本身似乎存在一个错误,这显然导致了Java可以看到登录和系统密钥链中的证书,但不能看到系统根中的证书。不幸的是,后者正是存储所有系统提供的证书的地方。:-(

一些用户报告说,

-Djavax.net.ssl.trustStore=NUL

-Djavax.net.ssl.trustStore=/dev/null

为他们解决了问题。我无法证实。当我尝试时,它对我不起作用。
不过,我很确定这东西以前能正常工作。

hivapdat

hivapdat6#

我试着现在就这样做,但我有问题,最后这对我不起作用。但是我试了一下,发现下面的解决方案对我很有效。它将以下内容设置到jvm:

-Djavax.net.ssl.trustStoreType=KeychainStore -Djavax.net.ssl.trustStore=/Library/Keychains/System.keychain

例如经由

export JAVA_TOOL_OPTIONS="-Djavax.net.ssl.trustStoreType=KeychainStore -Djavax.net.ssl.trustStore=/Library/Keychains/System.keychain"

相关问题