Jetty HttpClient を使用して HTTPS リクエストを作成しています。SSL 接続を確立した後、データを送信する前に、目的のサーバーと通信していることを確認したいと思います。基本的に、リクエストを www.foo.com に送信する場合、サーバーにそのドメイン名の証明書があることを確認します。
これを達成する 1 つの方法は、自分自身を作成し、それを に与えられたTrustManager
作成に使用することです。トラスト マネージャーで使用可能なコールバックは次のとおりです。SslContextFactory
HttpClient
checkServerTrusted(X509Certificate[] chain, String authType)
checkServerTrusted(X509Certificate[] chain, String authType,
Socket socket)
checkServerTrusted(X509Certificate[] chain, String authType,
SSLEngine engine)
すべての場合において、証明書にはアクセスできますが、元の要求にはアクセスできません (元のドメイン名が必要です)。
HttpExchange
思いつく 2 番目のオプションは、要求を行うために使用している子孫からピア証明書にアクセスすることです。たとえば、 を呼び出した後HttpClient.send(exchange)
、ピア証明書にアクセスして検証を実行できました。SSLEngine
ただし、交換から SSL 情報 (ピア証明書またはSSLSocket
オブジェクトのいずれか) にアクセスする方法はないようです。
さらに、HttpClient 自体は証明書の内容の検証を行っていないようです。これは、検証ロジックをプラグインする場所がなく、HttpClient が DNS スプーフィング攻撃に対して脆弱であることを意味します (トピックの説明については、http: //www.cs.utexas.edu/~shmat/shmat_ccs12.pdf を参照してください)。 )。
サーバー名の検証をどこにプラグインできるかについて、誰かがヒントを与えることができますか?