1

そのための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 のキーストアにインポートされます。中間証明書はそうではありません...しかし

  1. 中間証明書は、私が信頼するルートによって署名されているため、中間証明書も信頼しています。
  2. Web サーバー証明書は、私が信頼する中間証明書で署名されています (ポイント 1)

では、検証は成功する必要がありますか? 何か間違っていますか?

どこかでこれを読んだ:

ブラウザは自動検出を実行できますが、サーバーからサーバーへはできません。

しかし、この機能がないことは非常に基本的です。この自動検出を行う明確な方法はありますか?

* *アップデート

はい、これが問題でした、GPI。ブラウザはサーバー証明書を検証できましたが、Java アプリケーションは検証できなかったため、混乱しました。その動作の原因は次のとおりです。

  • サーバーは、証明書チェーン全体ではなく、最終的な証明書のみを送信します。
  • 証明書は最近購入され、比較的新しい中間証明書で署名されています。
  • ブラウザには、中間証明書を含む証明書の比較的最新のリストがあります。
  • java には最新ではない相対的な証明書のリストがあり、中間証明書は内部にありませんでした。
  • ブラウザは、中間証明書を介して最終証明書を検証します Java は、次の理由で証明書チェーンをチェックできませんでした。1. チェーンが送信されませんでした。2. 最終証明書 (中間証明書) の署名者がトラスト アンカーではありませんでした。

解決策は次のとおりです。

  • サーバーが証明書チェーン全体を返す
  • Java トラストストアに追加される中間証明書
4

2 に答える 2

3

すでにチェーンをチェックしていると思いますので、RootCert が IntermediateCert に署名し、IntermediateCert が ServerCert署名し有効なX500 ネーム チェーンとすべて...

つまり、RootCertを信頼するだけで十分であるという論理は有効ですが、パスを構築するには、クライアントがパス内のすべての証明書を所有している必要があることを忘れないでください。

あなたの場合、ルート証明書のみを信頼する場合、残りの証明書チェーン(中間および最終)をアドバタイズするのはサーバー次第です。誰も HTTP クライアントに中間証明書を「与える」ことがない場合、クライアントは、中間証明書不可能であることを知らずにルートからサーバーに移動するため失敗します。

オプションを使用してクライアントを起動すると、実際にサーバー証明書チェーンが何であるかを確認でき-Djavax.net.debug=allます。チェーンの長さが 1 の場合、サーバーは最終証明書のみをアドバタイズし、クライアントが中間証明書の存在を推測する方法はありません。

(ブラウザを使用してサーバー証明書を確認することもできますが、ブラウザにはトラスト アンカーまでのパス全体が表示されることに注意してください。そのため、サーバー チェーンが何であるかを推測したい場合は、このパスからブラウザーのアンカーを削除してください)。

運用サービスでは、証明書プロバイダーの Web サイトを参照して、ルート証明書と見なされるものを確認する必要があります (最上位の証明書ではない場合があります)。この有効なルートはクライアントのトラスト アンカーである必要があり、サーバーはパスの最後の証明書 (一般名がサーバーの DNS 名である証明書) からチェーン内の他のすべての証明書を少なくともアドバタイズする必要があります。

于 2013-04-12T15:56:00.807 に答える
0

Https 経由で接続するには、HttpsURLConnection オブジェクトを使用する必要があります。HttpURLConnection オブジェクトを使用して接続を作成することはできません。

于 2013-04-12T15:12:46.727 に答える