135

HTTP 経由でリモート サーバー上の REST API を照会する Java アプリケーションを開発しています。セキュリティ上の理由から、この通信は HTTPS に切り替える必要があります。

Let's Encryptが公開ベータ版を開始したので、現在Java がデフォルトで証明書を使用して動作する (または将来的に動作することが確認されている) かどうかを知りたいです。

Let's Encrypt はIdenTrust によって中間相互署名を取得しました。これは朗報です。ただし、このコマンドの出力には次の 2 つが見つかりません。

keytool -keystore "..\lib\security\cacerts" -storepass changeit -list

信頼できる CA を各マシンに手動で追加できることは知っていますが、私のアプリケーションは自由にダウンロードして追加の構成なしで実行できる必要があるため、「箱から出して」動作するソリューションを探しています。良いニュースはありますか?

4

4 に答える 4

61

構成ファイルのバックアップを含むローカル構成の変更を喜んで行う私たちへの詳細な回答:

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
于 2016-07-11T17:07:49.497 に答える