API URLの1つをポーリングし、応答からHTTP 200ステータスコードを取得できない場合はメールで送信する簡単なアプリモニターを構築しています(これは、何らかの理由でAPIがダウンしていることを示します)。
私はHttpClientを使用しています4.1(APIが3.xとは異なるため、これは重要です大きく)。
APIはSSLで保護されていますが、次のように入力します。
webブラウザにリダイレクトします
エラーを引き起こすことなく。
HttpClientがこのURL(http://example.com/our-api
)にアクセスしようとすると、javax.net.ssl.SSLPeerUnverifiedException
例外で失敗し、次のメッセージが表示されます。
認証されていないピア
this post(この問題を回避するいくつかの方法を提供します-実際に今夜試して実装しようとする解決策)で証明されているように、これは他の人にとっても頻繁に起こります。
この他の投稿(およびそれに類似する他の投稿)がしていないことは、これが最初に起こっている理由を説明することです!だから、「これをどうやって修正するの?」私は「なぜこれが起こっているのか?」と尋ねるだろうと考えました。提案された解決策の1つに進む前に、私は何が知りたいですか問題は、私が修正しようとしていることです;-)
サーバーの証明書が自己署名されている場合、これは設計どおりに機能しており、サーバーの証明書をキーストアにインポートする必要があります。
サーバー証明書が既知のCAによって署名されていると仮定すると、最新のブラウザーで使用可能なCA証明書のセットはJDK/JREに同梱されている限定セットよりもはるかに大きいため、これが発生しています。
あなたが言及した投稿の1つにあるEasySSLソリューションは、エラーを埋めるだけであり、サーバーに有効な証明書があるかどうかはわかりません。
適切なルートCAをキーストアにインポートして、証明書を検証する必要があります。通常のSSLコードではこれを回避できない理由があります。それは、あたかも安全ではあるがそうではないように動作するプログラムを作成できないようにするためです。
これは次の場合にスローされます
...ピアが自身を識別できなかった(たとえば、証明書なし、使用されている特定の暗号スイートが認証をサポートしていない、SSLハンドシェイク中にピア認証が確立されなかった)この例外がスローされます。
おそらく、この例外の原因(スタックトレース)は、この例外がスローされる理由を示しています。ほとんどの場合、Javaとともに出荷されるデフォルトのキーストアには、使用されているTTPのルート証明書が含まれていません(および信頼されていません)。
答えは、ルート証明書を(たとえば、ブラウザのSSL接続から)取得し、cacerts
ファイルにインポートし、Java JDKに同梱されているkeytool
を使用して信頼します。プログラムで別のトラストストアを割り当てます。
keytool -import -v -alias cacerts -keystore cacerts.jks -storepass changeit -file C:\cacerts.cer
ImはJava開発者ではありませんが、Javaアプリを使用してRESTful APIをテストしていました。エラーを修正するには、中間証明書をインストールする必要がありましたlighttpdを使用していたとき、元の証明書はIISサーバーにインストールされていました。それが役に立てば幸いです。これらはサーバーにない証明書でした。 。