2

Jetty HttpClient を使用して HTTPS リクエストを作成しています。SSL 接続を確立した後、データを送信する前に、目的のサーバーと通信していることを確認したいと思います。基本的に、リクエストを www.foo.com に送信する場合、サーバーにそのドメイン名の証明書があることを確認します。

これを達成する 1 つの方法は、自分自身を作成し​​、それを に与えられたTrustManager作成に使用することです。トラスト マネージャーで使用可能なコールバックは次のとおりです。SslContextFactoryHttpClient

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 を参照してください)。 )。

サーバー名の検証をどこにプラグインできるかについて、誰かがヒントを与えることができますか?

4

0 に答える 0