Подтвердить что ты не робот

Как настроить виртуальную машину Java для использования корневых сертификатов (truststore), обрабатываемых 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 использовать доверительный магазин по умолчанию для os? (Mac OS X в моем случае).

4b9b3361

Ответ 1

Я могу настроить хранилище по умолчанию, добавив эту систему при запуске виртуальной машины:

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

Я все еще не понимаю, зачем мне это нужно. Это должно быть значение по умолчанию. Также очень обидно добавлять это каждый раз. Есть ли лучший способ, например. некоторые настройки ОС?

Ответ 2

Ах! Я знаю эту проблему. У меня была аналогичная проблема, и она была связана с привязками Java в OSX. Как только я установил последнюю версию, она была исправлена.

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

Ответ 3

Я думаю, всем ясно, что JAVA нуждается в способе определить доверительный магазин по умолчанию при работе с SSL, поэтому эта информация передается JAVA каким-то образом, поэтому я думаю, что "обновленный" вопрос в том, как сделать это в режиме "один раз-раз-и-забыть-всегда".

Лучший способ, которым я мог найти, - установить переменную среды JAVA_TOOL_OPTIONS на уровне вашей ОС, если эта переменная среды установлена, то JAVA будет запущен по умолчанию с аргументами, которые вы предоставили в этой переменной окружения.

Поэтому вам не нужно устанавливать -Djavax.net.ssl.trustStore=/Library/Java/Home/lib/security/cacerts при запуске JVM, вместо этого устанавливайте JAVA_TOOL_OPTIONS переменную окружения "один раз" на уровне вашей ОС со значением -Djavax.net.ssl.trustStore=/Library/Java/Home/lib/security/cacerts , а затем вы закончите.

Ниже приведена выдержка из № 1 "Дополнительные чтения":

Когда эта переменная среды установлена, функция JNI_CreateJavaVM (в API JNI Invocation API) добавляет значение среды переменная к параметрам, указанным в аргументе JavaVMInitArgs.

Остерегайтесь только остерегаться ниже, выдержка из № 1 "Дальнейшие чтения":

В некоторых случаях этот параметр отключен по соображениям безопасности, для например, в ОС Solaris опция отключена, когда эффективный пользователь или идентификатор группы отличается от реального ID.

Ниже приведено еще одно предостережение (выдержка из № 1 "Дальнейшие чтения" ), но я думаю, поскольку контекст не связан с аргументом выбора виртуальной машины, поэтому он не имеет значения, но просто нужно упомянуть.

Поскольку эта переменная среды рассматривается в то время, когда Вызывается JNI_CreateJavaVM, он не может использоваться для увеличения команды линии с параметрами, которые обычно обрабатываются пусковой установкой, для например, выбор виртуальной машины с использованием опции -client или -server.

Дальнейшие чтения:

Ответ 4

Вы можете использовать провайдера Apple JCA, чтобы использовать цепочку ключей OSX в качестве хранилища доверенных сертификатов Java. Просто запустите JVM со следующим системным свойством:

-Djavax.net.ssl.trustStoreType=KeychainStore

Вы можете установить это свойство для каждой запущенной JVM, используя JAVA_TOOL_OPTIONS среды JAVA_TOOL_OPTIONS, как описано в ответе hagrawal.