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

Tam*_*mas 14 java macos ssl-certificate truststore scribe

使用scribe OAuth库时出现以下异常.

Caused by: javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
Run Code Online (Sandbox Code Playgroud)

基于一些谷歌搜索似乎我应该以某种方式设置JVM信任库.

为什么我需要这样做?如何指示Java VM使用os的默认信任库?(在我的情况下是Mac OS X).

小智 17

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

-Djavax.net.ssl.trustStoreType=KeychainStore
Run Code Online (Sandbox Code Playgroud)

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

  • 这是迄今为止最好的答案。谢谢你! (2认同)

Tam*_*mas 9

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

-Djavax.net.ssl.trustStore=/Library/Java/Home/lib/security/cacerts
Run Code Online (Sandbox Code Playgroud)

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

  • @sehrgut 实际上有一个定义的机制来检查应该使用的已撤销证书,而不是让每个应用程序都带有自己的信任存储。安装公司根证书已经是一场噩梦,因为每个客户端系统上分布着如此多的信任存储。 (3认同)

hag*_*wal 6

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

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

因此,您无需在 -Djavax.net.ssl.trustStore=/Library/Java/Home/lib/security/cacerts 每次启动 JVM 时都 进行设置,而是JAVA_TOOL_OPTIONS 在您的操作系统级别 环境变量“一次”设置为值 as-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 选择。

进一步阅读: