[英]How to set up Java VM to use the root certificates (truststore) handled by Mac OS X
使用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)。
我可以通過在啟動VM時添加此系統pro來設置默認信任庫:
-Djavax.net.ssl.trustStore=/Library/Java/Home/lib/security/cacerts
我仍然不明白為什么我需要這樣做。 這應該是默認值。 每次添加它也很煩人。 有沒有更好的方法,例如某些操作系統設置?
啊! 我知道這個問題。 我有類似的問題,它與OSX中的Java綁定有關。 一旦我安裝了最新版本,它就得到了修復。
我認為每個人都清楚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),但我認為因為上下文不是關於VM選擇參數所以它不相關,而只是提及。
由於在調用JNI_CreateJavaVM時檢查此環境變量,因此不能使用通常由啟動程序處理的選項來擴充命令行,例如,使用-client或-server選項進行VM選擇。
進一步閱讀:
您可以使用Apple JCA Provider將OSX鑰匙串用作Java信任庫。 只需使用以下系統屬性啟動JVM:
-Djavax.net.ssl.trustStoreType=KeychainStore
您可以使用JAVA_TOOL_OPTIONS
環境變量為每個已啟動的JVM設置此屬性,如hagrawal的回答中所述 。
要使 Java 使用 macOS 鑰匙串,請將以下參數傳遞給 Java VM:
-Djavax.net.ssl.trustStoreType=KeychainStore
但是,Apple JCE 提供程序(處理鑰匙串訪問)或 macOS 本身似乎存在錯誤,這顯然會導致 Java 看到登錄和系統鑰匙串中的證書,但不是那些系統根。 不幸的是,后者正是存儲所有系統提供的證書的地方。 :-(
一些用戶報告說添加
-Djavax.net.ssl.trustStore=NUL
或者
-Djavax.net.ssl.trustStore=/dev/null
已經為他們解決了問題。 我無法證實這一點。 當我嘗試時它對我不起作用。
不過,我很確定這曾經可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.