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

时间:2013-01-11 14:50:33

标签: java macos ssl-certificate scribe truststore

使用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使用os的默认信任库? (在我的情况下是Mac OS X)。

4 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

因此,每次启动JVM时都不需要设置 -Djavax.net.ssl.trustStore=/Library/Java/Home/lib/security/cacerts ,而是设置 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),但我认为因为上下文不是关于虚拟机选择参数所以它不相关,只是提及。

  

因为此时检查此环境变量   调用JNI_CreateJavaVM,它不能用于扩充命令   通常由发射器处理的选项的行   例如,使用-client或-server选项选择VM。

进一步阅读:

答案 3 :(得分:0)

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

-Djavax.net.ssl.trustStoreType=KeychainStore

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