Подробный ответ для тех из нас, кто хочет внести локальные изменения конфигурации, включая резервное копирование файла конфигурации:
1. Перед внесением изменений проверьте, работает ли он.
Если у вас еще нет тестовой программы, вы можете использовать мою программу ping java SSLPing, которая проверяет рукопожатие TLS (будет работать с любым портом SSL / TLS, а не только с HTTPS). Я буду использовать предварительно созданный SSLPing.jar, но прочитать код и собрать его самостоятельно - это быстрая и простая задача:
$ git clone https://github.com/dimalinux/SSLPing.git
Cloning into 'SSLPing'...
[... output snipped ...]
Поскольку моя версия Java более ранняя, чем 1.8.0_101 (на момент написания этой статьи не выпущена), сертификат Let's Encrypt по умолчанию не проверяется. Давайте посмотрим, как выглядит сбой, прежде чем применять исправление:
$ java -jar SSLPing/dist/SSLPing.jar helloworld.letsencrypt.org 443
About to connect to 'helloworld.letsencrypt.org' on port 443
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
[... output snipped ...]
2. Импортируйте сертификат.
Я использую Mac OS X с установленной переменной среды JAVA_HOME. Более поздние команды будут предполагать, что эта переменная установлена для изменяемой установки Java:
$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home/
Сделайте резервную копию файла cacerts, который мы будем изменять, чтобы вы могли отменить любые изменения без переустановки JDK:
$ sudo cp -a $JAVA_HOME/jre/lib/security/cacerts $JAVA_HOME/jre/lib/security/cacerts.orig
Загрузите сертификат подписи, который нам нужно импортировать:
$ wget https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.der
Выполните импорт:
$ sudo keytool -trustcacerts -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit -noprompt -importcert -alias lets-encrypt-x3-cross-signed -file lets-encrypt-x3-cross-signed.der
Certificate was added to keystore
3. Убедитесь, что после изменений он работает.
Убедитесь, что Java теперь успешно подключается к порту SSL:
$ java -jar SSLPing/dist/SSLPing.jar helloworld.letsencrypt.org 443
About to connect to 'helloworld.letsencrypt.org' on port 443
Successfully connected