25

使用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)。

4

4 回答 4

20

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

-Djavax.net.ssl.trustStoreType=KeychainStore

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

于 2019-07-20T00:57:16.193 回答
14

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

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

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

于 2013-01-11T17:19:49.297 回答
6

我想大家都清楚,JAVA在处理SSL的时候需要一种方法来识别默认的truststore,所以这个信息已经以某种方式传递给了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 选择。

进一步阅读:

于 2016-12-29T01:14:50.907 回答
0

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

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

于 2016-12-28T15:46:45.557 回答