Apache-httpclient-custom-ssl-context
Apache HttpClient-カスタムSSLコンテキスト
Secure Socket Layerを使用すると、クライアントとサーバー間に安全な接続を確立できます。 クレジットカード番号、ユーザー名、パスワード、ピンなどの機密情報を保護するのに役立ちます。
*HttpClient* ライブラリを使用して独自のSSLコンテキストを作成することにより、接続をより安全にすることができます。
以下に示す手順に従って、HttpClientライブラリを使用してSSLContextをカスタマイズします-
ステップ1-SSLContextBuilderオブジェクトを作成する
*SSLContextBuilder* は、SSLContextオブジェクトのビルダーです。 *SSLContexts* クラスの* custom()*メソッドを使用してオブジェクトを作成します。
//Creating SSLContextBuilder object
SSLContextBuilder SSLBuilder = SSLContexts.custom();
ステップ2-キーストアをロードする
パス Java_home_directory/jre/lib/security/ で、cacertsという名前のファイルを見つけることができます。 これをキーストアファイル(拡張子.jks)として保存します。 SSLContextBuilder クラスの* loadTrustMaterial()メソッドを使用して、キーストアファイルとそのパスワード(デフォルトでは *changeit )をロードします。
//Loading the Keystore file
File file = new File("mykeystore.jks");
SSLBuilder = SSLBuilder.loadTrustMaterial(file, "changeit".toCharArray());
ステップ3-SSLContextオブジェクトを作成する
SSLContextオブジェクトは、セキュアソケットプロトコルの実装を表します。 * build()*メソッドを使用してSSLContextを構築します。
//Building the SSLContext
SSLContext sslContext = SSLBuilder.build();
ステップ4-SSLConnectionSocketFactoryオブジェクトの作成
*SSLConnectionSocketFactory* は、TSLおよびSSL接続用の階層化されたソケットファクトリです。 これを使用すると、信頼できる証明書のリストを使用してHttpsサーバーを検証し、指定されたHttpsサーバーを認証できます。
これはさまざまな方法で作成できます。 SSLConnectionSocketFactory オブジェクトの作成方法に応じて、すべてのホストを許可したり、自己署名証明書のみを許可したり、特定のプロトコルのみを許可したりできます。
特定のプロトコルのみを許可するには、SSLContextオブジェクトを渡すことで *SSLConnectionSocketFactory オブジェクトを作成します。プロトコルを表す文字列配列をサポートする必要があり、暗号スーツを表す文字列配列をサポートする必要があり、HostnameVerifierオブジェクトをコンストラクタに渡します。
new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1"}, null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
すべてのホストを許可するには、 SSLContextオブジェクトと NoopHostnameVerifier オブジェクトを渡すことで SSLConnectionSocketFactory オブジェクトを作成します。
//Creating SSLConnectionSocketFactory SSLConnectionSocketFactory object
SSLConnectionSocketFactory sslConSocFactory = new SSLConnectionSocketFactory(sslcontext, new NoopHostnameVerifier());
ステップ5-HttpClientBuilderオブジェクトを作成する
*HttpClients* クラスの* custom()*メソッドを使用して、HttpClientBuilderオブジェクトを作成します。
//Creating HttpClientBuilder
HttpClientBuilder clientbuilder = HttpClients.custom();
ステップ6-SSLConnectionSocketFactoryオブジェクトを設定する
- setSSLSocketFactory()メソッドを使用して、SSLConnectionSocketFactoryオブジェクトを *HttpClientBuilder に設定します。
//Setting the SSLConnectionSocketFactory
clientbuilder = clientbuilder.setSSLSocketFactory(sslConSocFactory);
ステップ7-CloseableHttpClientオブジェクトを構築する
- build()メソッドを呼び出して、 *CloseableHttpClient オブジェクトをビルドします。
//Building the CloseableHttpClient
CloseableHttpClient httpclient = clientbuilder.build();
ステップ8-HttpGetオブジェクトを作成する
*HttpGet* クラスは、URIを使用して指定されたサーバーの情報を取得するHTTP GET要求を表します。
URIを表す文字列を渡してHttpGetクラスをインスタンス化することにより、HTTP GETリクエストを作成します。
//Creating the HttpGet request
HttpGet httpget = new HttpGet("https://example.com/");
ステップ9-リクエストを実行する
- execute()*メソッドを使用してリクエストを実行します。
//Executing the request
HttpResponse httpresponse = httpclient.execute(httpget);
例
次の例は、SSLContrextのカスタマイズを示しています-
import java.io.File;
import javax.net.ssl.SSLContext;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;
public class ClientCustomSSL {
public final static void main(String[] args) throws Exception {
//Creating SSLContextBuilder object
SSLContextBuilder SSLBuilder = SSLContexts.custom();
//Loading the Keystore file
File file = new File("mykeystore.jks");
SSLBuilder = SSLBuilder.loadTrustMaterial(file,
"changeit".toCharArray());
//Building the SSLContext usiong the build() method
SSLContext sslcontext = SSLBuilder.build();
//Creating SSLConnectionSocketFactory object
SSLConnectionSocketFactory sslConSocFactory = new SSLConnectionSocketFactory(sslcontext, new NoopHostnameVerifier());
//Creating HttpClientBuilder
HttpClientBuilder clientbuilder = HttpClients.custom();
//Setting the SSLConnectionSocketFactory
clientbuilder = clientbuilder.setSSLSocketFactory(sslConSocFactory);
//Building the CloseableHttpClient
CloseableHttpClient httpclient = clientbuilder.build();
//Creating the HttpGet request
HttpGet httpget = new HttpGet("https://example.com/");
//Executing the request
HttpResponse httpresponse = httpclient.execute(httpget);
//printing the status line
System.out.println(httpresponse.getStatusLine());
//Retrieving the HttpEntity and displaying the no.of bytes read
HttpEntity entity = httpresponse.getEntity();
if (entity != null) {
System.out.println(EntityUtils.toByteArray(entity).length);
}
}
}
出力
実行すると、上記のプログラムは次の出力を生成します。
HTTP/1.1 200 OK
1270