Come impostare Java VM per utilizzare i certificati root (truststore) gestiti da Mac OS X
Ottengo la seguente eccezione durante l'utilizzo della libreria scribe OAuth.
Caused by: javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
Sulla base di alcuni googling sembra che dovrei configurare in qualche modo il truststore JVM.
Perché devo farlo? Come posso istruire la VM Java a utilizzare il truststore predefinito del sistema operativo? (Mac OS X nel mio caso).
3 answers
Posso configurare il truststore predefinito aggiungendo questo sistema corretto all'avvio della VM:
-Djavax.net.ssl.trustStore=/Library/Java/Home/lib/security/cacerts
Ancora non capisco perché ho bisogno di farlo. Questo dovrebbe essere l'impostazione predefinita. È anche molto fastidioso aggiungere questo ogni volta. C'è un modo migliore, ad esempio alcune impostazioni del sistema operativo?
Ah! conosco questo problema. Ho avuto un problema simile ed era correlato ai binding Java in OSX. Una volta installata l'ultima versione, è stata riparata.
Penso che sia chiaro a tutti che JAVA ha bisogno di un modo per identificare il truststore predefinito, quando si ha a che fare con SSL, quindi questa informazione è stata passata a JAVA in qualche modo, quindi penso che la domanda "aggiornata" in mano sia come farlo in un modo fai-da-una-volta-e-poi-dimentica-ogni volta.
Il modo migliore che ho potuto trovare è stato impostando la variabile di ambiente JAVA_TOOL_OPTIONS
a livello di sistema operativo, se questa variabile di ambiente è impostata, JAVA verrà avviato di default con gli argomenti forniti in questa variabile d'ambiente.
Quindi, non è necessario impostare -Djavax.net.ssl.trustStore=/Library/Java/Home/lib/security/cacerts
ogni volta che JVM viene lanciato, invece impostato JAVA_TOOL_OPTIONS
variabile d'ambiente "una volta" a livello del sistema operativo con valore come -Djavax.net.ssl.trustStore=/Library/Java/Home/lib/security/cacerts
e poi hai finito.
Di seguito è riportato l'estratto dal n. 1 di "Ulteriori letture":
Quando questa variabile d'ambiente è impostata, la funzione JNI_CreateJavaVM (nell'API di invocazione JNI) antepone il valore dell'ambiente variabile alle opzioni fornito nel suo argomento JavaVMInitArgs.
Solo avvertimento a cui prestare attenzione è menzionato di seguito, estratto dal n. 1 di "Ulteriori letture":
In alcuni casi questa opzione è disabilitata per motivi di sicurezza, per esempio, su Solaris OS l'opzione è disabilitata quando l'utente effettivo o l'ID di gruppo differisce dall'ID reale.
Di seguito è riportato un altro avvertimento (estratto dal n. 1 di "Ulteriori letture") a cui prestare attenzione, ma penso che dal momento che il contesto non riguarda l'argomento di selezione della VM, quindi non è rilevante, ma solo per menzionarlo.
Poiché questa variabile d'ambiente viene esaminata nel momento in cui JNI_CreateJavaVM è chiamato, non può essere utilizzato per aumentare il comando linea con le opzioni che normalmente sarebbero gestite dal programma di avvio, per esempio, selezione VM utilizzando l'opzione-client o-server.
Ulteriore letture: