HTTPクライアントでクライアント証明書を渡すにはどうすればよいですか?



How Do I Pass Client Certificate With Http Client



解決:

キーストアについてSSLSocketFactory(javaxではなくorg.apache.http)に通知し、https接続に使用するようにDefaultHTTPClientを構成する必要があります。

例はここにあります:http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientCustomSSL.java




クライアント証明書は、接続を確立するときのTLSハンドシェイク中に送信され、その接続内でHTTP経由で送信することはできません。

通信は次のように階層化されます。



  • 内のHTTP(アプリケーション層プロトコル)
  • 内のTLS(プレゼンテーション層プロトコル)
  • 内のTCP(トランスポート層プロトコル)
  • IP(ネットワーク層プロトコル)

HTTP(メソッド、ヘッダー、URL、リクエスト本文)に影響を与える前に、TLSハンドシェイク中にクライアント証明書を送信する必要があります。サーバーは、後で送信されるクライアント証明書を受け入れません。

から切り替えることをお勧めします DefaultHttpClient (非推奨)から CloseableHttpClient これは、try-with-resourcesでよりクリーンに機能します。

ApacheHttpClient 4.5は、相互TLSをかなり便利にします。この回答は、Apache HttpClient4.5.3でテストされています。



本質的な出発点は使用することです loadKeyMaterial クライアント証明書とそのキー(クライアントキーペア)をにロードします SSLContext

SSLContext sslContext = SSLContexts.custom()。loadKeyMaterial(MutualHttpsMain.class.getResource(TEST_CLIENT_KEYSTORE_RESOURCE)、storePassword、keyPassword、(エイリアス、ソケット)-> aliases.keySet()。iterator()。next())。build();

そして最後に、そのソケットファクトリを使用してHTTPクライアントを構築します。

CloseableHttpClient httpclient = HttpClients .custom()。setSSLContext(sslContext).build();

そのクライアントを使用すると、すべての要求を相互TLS認証を使用して実行できます。

CloseableHttpResponse closeableHttpResponse = httpclient.execute(new HttpGet(URI.create( 'https://mutual-tls.example.com/')));

これは、ApacheHttpClientとの相互TLSの完全に実行可能な例です。

import org.apache.http.HttpEntity; import org.apache.http.StatusLine; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.ssl.SSLContexts;インポートjavax.net.ssl.SSLContext;インポートjava.io.Console;インポートjava.io.IOException;インポートjava.io.InputStream; java.net.URIをインポートします。インポートjava.nio.ByteBuffer;インポートjava.nio.channels.Channels;インポートjava.nio.channels.ReadableByteChannel;インポートjava.nio.channels.WritableByteChannel;インポートjava.security.GeneralSecurityException; public class MutualHttpsMain {private static final String TEST_URL = 'https://mutual-tls.example.com/';プライベート静的最終文字列TEST_CLIENT_KEYSTORE_RESOURCE = '/ mutual-tls-keystore.p12'; public static void main(String [] args)throws GeneralSecurityException、IOException {Console console = System.console(); char [] storePassword = console.readPassword( 'Key + Keystore password:'); char [] keyPassword = storePassword; SSLContext sslContext = SSLContexts.custom()。loadKeyMaterial(MutualHttpsMain.class.getResource(TEST_CLIENT_KEYSTORE_RESOURCE)、storePassword、keyPassword、(エイリアス、ソケット)-> aliases.keySet()。iterator()。next())。build(); try(CloseableHttpClient httpclient = HttpClients .custom()。setSSLContext(sslContext).build(); CloseableHttpResponse closeableHttpResponse = httpclient.execute(new HttpGet(URI.create(TEST_URL)))){console.writer()。println(closeableHttpResponse。 getStatusLine()); HttpEntityエンティティ= closeableHttpResponse.getEntity(); try(InputStream content = entity.getContent(); ReadableByteChannel src = Channels.newChannel(content); WritableByteChannel dest = Channels.newChannel(System.out)){ByteBuffer buffer = ByteBuffer.allocateDirect(16 * 1024); while(src.read(buffer)!= -1){buffer.flip(); dest.write(バッファ); buffer.compact(); } buffer.flip(); while(buffer.hasRemaining())dest.write(buffer); }}}}

通常、GradleまたはMavenを使用してこのようなものを実行することをお勧めしますが、このYakシェービングを可能な限り最小限に抑えるために、これを構築して実行するためのベースラインJDK命令を提供します。

次のページからJARをダウンロードします。

  • Apache HttpClient 4.5.3
  • ApacheCommonsコーデック1.10
  • Apache Commons Logging 1.2
  • Apache HttpCore 4.4.8

上記の例全体を次のように保存します MutualHttpsMain.java

PKCS#12をにコピーします 相互-tls-keystore.p12 同じディレクトリにあります。

次のようにコンパイルします(macOS / Linux / * nix-likesの場合)。

javac MutualHttpsMain.java -cp httpclient-4.5.3.jar:httpcore-4.4.8.jar

またはWindowsの場合:

javac MutualHttpsMain.java -cp httpclient-4.5.3.jar; httpcore-4.4.8.jar

次のように実行します(macOS / Linux / * nix-likesで):

java -cp httpclient-4.5.3.jar:commons-codec-1.10.jar:commons-logging-1.2.jar:httpcore-4.4.8.jar:。 MutualHttpsMain

次のように実行します(Windowsの場合)。

java -cp httpclient-4.5.3.jar; commons-codec-1.10.jar; commons-logging-1.2.jar; httpcore-4.4.8.jar;。 MutualHttpsMain