構成ファイルのバックアップを含むローカル構成の変更を喜んで行う私たちへの詳細な回答:
1.変更前に動作するかどうかをテストします
まだテスト プログラムがない場合は、TLS ハンドシェイクをテストする私の Java SSLPing ping プログラムを使用できます (HTTPS だけでなく、任意の SSL/TLS ポートで動作します)。ここではビルド済みの 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.証明書をインポートする
Java_HOME 環境変数が設定された Mac OS X を使用しています。以降のコマンドでは、変更する 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