2016-07-03 18 views
1

HttpsURLConnectionのHostnameVerifierとSSLSocketFactoryをオーバーライドしないコードを理解しようとしています。現在のコードでは、SSLリクエストをうまく行うことができますが、それは私にとってはちょっと混乱します。 HostnameVerifierクラスとSSLSocketFactoryクラスのデフォルト実装はどのように機能しますか?証明書のCAとホスト名を確認するか、これらのチェックをすべてバイパスしますか?HostnameVerifierとSSLSocketFactoryのデフォルト実装を使用したHttpsURLConnectioinの動作

また、リクエストにlocalhostが含まれていると、特別な動作がありますか? URLは次のようになります
https://localhost:/

ありがとうございます。

答えて

2

これは、JDK jre/lib/security/cacertsの信頼できるストア内の信頼できるCA証明書または設定したものと比較してCA証明書をチェックします。

チェーンのすべての証明書が即時署名者だけでなく、信頼されることも確認します。既定では、失効した証明書はオンラインでチェックされませんが、java.securityポリシーファイルで有効にすることができます。

証明書に対してホスト名もチェックします。 追加のCNとワイルドカードCNをサポートします。ローカルホストに関する

拡張質問:

localhostは、他のどのようなホスト名のみです。証明書に記載する必要があります。しかし、あなたはその証明書を与えるために公式CAを見つけることはできません:-)

実際の証明書をローカルホストで使用したい場合は、別のホスト名でアドレス指定します。あなたがfoo.bar.comのために証明書を介して実行したい場合は、あなたのhostsファイルに追加します(勝利:Unixの/etc/hosts%WINDOWS%\system32\drivers\etc\hosts)ライン:

127.0.0.1 foo.bar.com 

今すぐブラウザを起動し、https://foo.bar.comに接続します。ローカルサーバーに接続し、SSLで暗号化されたHTTP要求を送信します。その要求には、実際のホスト名ではなくURLのホスト名が含まれています。

私は過度に思っていました:ブラウザはサーバからSSL証明書を受け取り、ちょうど呼び出されたホスト名とCNを比較します。これが一致すると、証明書が信頼できるかどうかを確認します(注文時に私を釘付けにしないでください。おそらく最初に信頼レベルをチェックします)。

ここでは失敗します。サーバによって提供された証明書にCNローカルホストが含まれていないため、クライアントは接続を中断します。あなたの場合、クライアントはHttpSSLrequestです。

クライアントにすべてがうまくいくと信じさせるには、 - ホスト名を偽装し、cacertsトラストストアに署名CAを追加するという2つのことができます。 - ホスト名と証明書のバリデータを実装します。

このチュートリアルでは、自己署名証明書が使用されているため、最初のアクセス時に警告を無効にしてブラウザに受け入れさせる必要があります。

+0

探している設定は何ですか?私はデフォルトのトラストストアがJDKのどこに設定されているのかわかりません。 – user1549994

+0

"追加のCNとワイルドカードCNをサポートしています。"ワイルドカードCNの意味は? localhostはワイルドカードCNと見なされますか?送信された要求はlocalhostを使用しますが、サーバが返す証明書には "localhost"が含まれていません。 – user1549994

+0

ワイルドカードのcertにはアスタリスクが含まれており、このドメインのすべてのサブドメインで動作します: '* .foo.com'は' bar.foo.com'、 'baz.foo.com'などで動作します。localhostで遊びたいのであれば、それを証明書に追加します。私の答えを見てください。 – thst

関連する問題