そのためのJava組み込み機能を介してhttps接続を確立しようとしています(HttpURLConnection
)。しかし、私はこの例外を受け取ります:
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
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
...
...
私の証明書チェーンは次のとおりです。
Root certificate -> Intermediate certificate -> Web server certificate
使用する証明書は「パス発見」の意味で正しいです。トラスト アンカーはルート証明書で、システムの Java のキーストアにインポートされます。中間証明書はそうではありません...しかし
- 中間証明書は、私が信頼するルートによって署名されているため、中間証明書も信頼しています。
- Web サーバー証明書は、私が信頼する中間証明書で署名されています (ポイント 1)
では、検証は成功する必要がありますか? 何か間違っていますか?
どこかでこれを読んだ:
ブラウザは自動検出を実行できますが、サーバーからサーバーへはできません。
しかし、この機能がないことは非常に基本的です。この自動検出を行う明確な方法はありますか?
* *アップデート
はい、これが問題でした、GPI。ブラウザはサーバー証明書を検証できましたが、Java アプリケーションは検証できなかったため、混乱しました。その動作の原因は次のとおりです。
- サーバーは、証明書チェーン全体ではなく、最終的な証明書のみを送信します。
- 証明書は最近購入され、比較的新しい中間証明書で署名されています。
- ブラウザには、中間証明書を含む証明書の比較的最新のリストがあります。
- java には最新ではない相対的な証明書のリストがあり、中間証明書は内部にありませんでした。
- ブラウザは、中間証明書を介して最終証明書を検証します Java は、次の理由で証明書チェーンをチェックできませんでした。1. チェーンが送信されませんでした。2. 最終証明書 (中間証明書) の署名者がトラスト アンカーではありませんでした。
解決策は次のとおりです。
- サーバーが証明書チェーン全体を返す
- Java トラストストアに追加される中間証明書