22

API URL の 1 つをポーリングし、応答から HTTP 200 ステータス コードを取得できない場合 (これは、何らかの理由で API がダウンしていることを示します) をメールで送信する単純なアプリ モニターを構築しています。

私は HttpClient 4.1を使用しています (API が3.xと大きく異なるため、これは重要です)。

私たちの API は SSL で保護されていますが、次のように入力します。

http://example.com/our-api

Web ブラウザにリダイレクトされます

https://example.com/our-api

エラーを発生させることなく。

HttpClient がこの URL ( ) にアクセスしようとすると、次のメッセージをhttp://example.com/our-api含む例外で失敗します。javax.net.ssl.SSLPeerUnverifiedException

ピアが認証されていません

この投稿で証明されているように、これは他の人にも多く見られます(この投稿は、この問題を回避するいくつかの方法も提供します-実際に今夜試して実装する解決策です).

この他の投稿 (およびそれに類似した他の投稿) が行っていないことは、そもそもなぜこれが起こっているのかを説明することです! ですから、「どうすればこれを修正できますか?」と尋ねるのではなく、「なぜこれが起こっているのですか?」提案された解決策の1つに飛びつく前に、私が修正しようとしている問題が何であるかを知りたいと思いました;-)

4

4 に答える 4

25

サーバーの証明書が自己署名されている場合、これは設計どおりに機能しているため、サーバーの証明書をキーストアにインポートする必要があります。

サーバー証明書がよく知られている CA によって署名されていると仮定すると、これは、最新のブラウザーで使用できる CA 証明書のセットが、JDK/JRE に同梱されている制限されたセットよりもはるかに大きいために発生します。

あなたが言及した投稿の 1 つで指定された EasySSL ソリューションはエラーを埋めるだけであり、サーバーに有効な証明書があるかどうかはわかりません。

証明書を検証するには、適切なルート CA をキーストアにインポートする必要があります。ストック SSL コードでこれを回避できないのには理由があります。それは、あたかも安全であるかのように振る舞うプログラムを作成できないようにするためです。

于 2012-07-31T23:23:32.263 に答える
7

これは、次の場合にスローされます。

... ピアが自分自身を識別できませんでした (たとえば、証明書がない、使用されている特定の暗号スイートが認証をサポートしていない、SSL ハンドシェイク中にピア認証が確立されなかった)、この例外がスローされます。

おそらく、この例外の原因 (スタック トレースの場所) から、この例外がスローされる理由がわかります。ほとんどの場合、Java に同梱されているデフォルトのキーストアには、使用されている TTP のルート証明書が含まれていません (そして信頼されていません)。

cacerts答えは、ルート証明書を (たとえば、ブラウザーの SSL 接続から) 取得し、それをファイルにインポートしてkeytool、Java JDK に同梱されているものを使用して信頼することです。そうしないと、別のトラスト ストアをプログラムで割り当てる必要があります。

于 2012-07-31T23:26:34.083 に答える