2

SSLソケットへの書き込み中に次の例外が発生しました

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors

ターゲット サーバーの証明書が信頼されていないようです。Windows 7 マシン、jdk7、および tomcat7 で問題なく実装をテストしました。openJDK 6 および tomcat7 を使用する ubuntu 10 LTS で例外がスローされます。ソケット ターゲット サーバーの sha1 および md5 フィンガープリントを取得しました。ストリーミングしようとしているサーバーの証明書が、ubuntu サーバーの trustet ではないというのは正しいですか? tomcats キーストアに指紋を付けることができますか? もしそうなら、どうすればいいですか?

4

1 に答える 1

5

トラスト ストアに追加する必要があるのはフィンガープリントではなく、実際の証明書です。

サーバー証明書自体を追加するか、CA 証明書の 1 つをチェーンに追加できます (特定のサーバーだけでなく、その CA からのすべての証明書を信頼する場合)。

証明書が何であるかを調べるには、OpenSSL を使用できます。

openssl s_client -showcerts -connect your.host.name:443

(ホスト名と 443 を実際に使用しているポートに置き換えます。)

間のブロック--BEGIN/END CERT...--は、PEM 形式の証明書です。openssl x509 -text -nooutを使用して(そしてそこに各ブロックを貼り付けて)内容を確認できます。

インポートする証明書をプレーン テキスト ファイル (例: certificate.pem) に保存します。信頼できる証明書のみをインポートする必要があります。ここにはある種の信仰の飛躍があります。(たとえば、ブラウザに接続して、キー マテリアルが一致するかどうかを確認することをお勧めします。)

トラストストアにインポートするには、次を使用します。

keytool -importcert -keystore truststore.jks -file certificate.pem

(エイリアス wit を指定する必要がある場合があります-alias some_name_you_choose。)

これがデフォルトのトラストストアに影響するようにする場合は、Java ホーム ディレクトリtruststore.jksの へのパスに置き換えます (デフォルトのパスワードは である必要があります)。lib/security/cacertschangeit


いずれにせよ、ターゲットサーバーはよく知られている CA から来ているように見えるため (そして、JRE のいくつかのバージョンで動作します)、最も簡単な修正は、cacerts動作する JRE からコピーを取得して手動でファイルを更新することです。結局のところ、JSSE リファレンス ガイドには次のように書かれています。

重要な注意: JDK は、/lib/security/cacerts ファイル内に限られた数の信頼できるルート証明書と共に出荷されます。keytool に記載されているように、このファイルをトラストストアとして使用する場合、このファイルに含まれる証明書を維持 (つまり、追加/削除) するのはユーザーの責任です。

接続するサーバーの証明書構成によっては、追加のルート証明書を追加する必要がある場合があります。適切なベンダーから必要な特定のルート証明書を取得します。


Qualys SSL Labs testerで示されているように、証明書チェーンの順序に問題があることは確かです (このサイトでは正しくありません) 。

于 2012-04-25T13:11:36.943 に答える