0

数か月間正常に動作している Java Web アプリケーションがあります。Box API ( https://upload.box.com/api/2.0 ) と統合して、ファイルをクラウド サービスに保存します。javax.net.ssl.SSLPeerUnverifiedException: peer not authenticatedBox Web サービスへの REST API 呼び出しを行おうとしているときに、突然、恐ろしい例外を受け取り始めました。

keytool ユーティリティを使用して証明書をキーストアに手動でインポートする方法を説明する投稿がたくさんあります。問題を解決するためにこれを行うことができることを理解しています。しかし、これは本当に正しい修正でしょうか?

私のアプリケーションが何ヶ月も正常に動作しているという事実から、 https://upload.box.comの証明書に何か変更があったと思います。Web ブラウザーで証明書を見ると、証明書は有効で、数週間前に更新されたばかりです。キーストアに何がありませんか?

キーストアにないのはルート CA 証明書ですか? その場合、新しいバージョンの Java から cacerts ファイルをコピーすることはできますか? 私のアプリは現在 JDK 1.6.0_33 を実行しています。

これが突然機能しなくなる理由と、「実際の」修正がどうあるべきかを理解しようとしています。JDK キーストアを変更することが正しいことではないようです。

4

1 に答える 1

1

4.2.6、4.3 Beta2より前の Apache HTTP Client 4.x を使用していると仮定します。この場合、javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated信頼されていない証明書からのものである可能性が最も高いです (それ以外の場合は、サーバーが送信しなかったことを意味します)。別の問題である証明書、この回答の詳細)。

アクセスしようとしているサーバーの現在の証明書は、2014 年 7 月 4 日に発行されたようです。これは、証明書とおそらくそのチェーンが最近実際に変更されたことを示しています。

手元に JDK 1.6.0_33 はありませんが、これらの CA 証明書の一部がデフォルトのバンドルに含まれていなかった可能性があります。いずれにせよ、cacerts古い JRE でも更新する価値があります (たとえば、信頼されなくなった CA 証明書を削除する場合のみ)。JSSE リファレンス ガイドには次のように明確に記載されています (確かにかなり長いドキュメントの途中ですが、「重要な注意事項」を検索する価値はあります...)。

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

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

JRE をアップグレードできない場合 (Java 6 は一般的にサポート対象外です)、cacertsより新しいバージョンからファイルを更新することは確かに賢明な妥協です。

Java 7 のさまざまな修正に加えて、Java 7+ では、SNI を必要とするホストに接続することもできます (ただし、この特定のホストには当てはまらないようです)。

于 2014-05-28T20:26:27.367 に答える