使用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)。
答案 0 :(得分:9)
我可以通过在启动VM时添加此系统属性来设置默认信任库:
-Djavax.net.ssl.trustStore=/Library/Java/Home/lib/security/cacerts
我仍然不明白为什么我需要这样做。这应该是默认值。每次添加它也很烦人。有没有更好的方法,例如一些操作系统设置?
答案 1 :(得分:0)
啊!我知道这个问题。 我有类似的问题,它与OSX中的Java绑定有关。 一旦我安装了最新版本,它就得到了修复。
答案 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中所述。