ApacheHttpClient-カスタムSSLコンテキスト
Secure Socket Layerを使用すると、クライアントとサーバーの間に安全な接続を確立できます。クレジットカード番号、ユーザー名、パスワード、ピンなどの機密情報を保護するのに役立ちます。
を使用して独自のSSLコンテキストを作成することにより、接続をより安全にすることができます。 HttpClient 図書館。
以下の手順に従って、HttpClientライブラリを使用してSSLContextをカスタマイズします-
ステップ1-SSLContextBuilderオブジェクトを作成する
SSLContextBuilderSSLContextオブジェクトのビルダーです。を使用してオブジェクトを作成しますcustom() の方法 SSLContexts クラス。
//Creating SSLContextBuilder object
SSLContextBuilder SSLBuilder = SSLContexts.custom();
ステップ2-キーストアをロードします
パスで Java_home_directory/jre/lib/security/、cacertsという名前のファイルを見つけることができます。これをキーストアファイル(拡張子.jks)として保存します。キーストアファイルとそのパスワード(changeit デフォルトで)を使用して loadTrustMaterial() の方法 SSLContextBuilder クラス。
//Loading the Keystore file
File file = new File("mykeystore.jks");
SSLBuilder = SSLBuilder.loadTrustMaterial(file, "changeit".toCharArray());
ステップ3-SSLContextオブジェクトを作成する
SSLContextオブジェクトは、セキュアソケットプロトコルの実装を表します。を使用してSSLContextを構築しますbuild() 方法。
//Building the SSLContext
SSLContext sslContext = SSLBuilder.build();
ステップ4-SSLConnectionSocketFactoryオブジェクトを作成する
SSLConnectionSocketFactoryTSLおよびSSL接続用のレイヤードソケットファクトリです。これを使用すると、信頼できる証明書のリストを使用してHttpsサーバーを検証し、指定されたHttpsサーバーを認証できます。
これはさまざまな方法で作成できます。作成方法に応じてSSLConnectionSocketFactory オブジェクト、すべてのホストを許可する、自己署名証明書のみを許可する、特定のプロトコルのみを許可するなどができます。
To allow only particular protocols、作成する SSLConnectionSocketFactory SSLContextオブジェクトを渡すことによるオブジェクト、プロトコルを表す文字列配列をサポートする必要があり、暗号スイートを表す文字列配列をサポートする必要があり、HostnameVerifierオブジェクトをそのコンストラクターに渡します。
new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1"}, null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
To allow all hosts, 作成する SSLConnectionSocketFactory SSLContextオブジェクトとを渡すことによってオブジェクト NoopHostnameVerifier オブジェクト。
//Creating SSLConnectionSocketFactory SSLConnectionSocketFactory object
SSLConnectionSocketFactory sslConSocFactory = new SSLConnectionSocketFactory(sslcontext, new NoopHostnameVerifier());
ステップ5-HttpClientBuilderオブジェクトを作成する
を使用してHttpClientBuilderオブジェクトを作成します custom() の方法 HttpClients クラス。
//Creating HttpClientBuilder
HttpClientBuilder clientbuilder = HttpClients.custom();
手順6-SSLConnectionSocketFactoryオブジェクトを設定する
SSLConnectionSocketFactoryオブジェクトをに設定します HttpClientBuilder を使用して setSSLSocketFactory() 方法。
//Setting the SSLConnectionSocketFactory
clientbuilder = clientbuilder.setSSLSocketFactory(sslConSocFactory);
手順7-CloseableHttpClientオブジェクトを作成する
ビルド CloseableHttpClient を呼び出すことによってオブジェクト build() 方法。
//Building the CloseableHttpClient
CloseableHttpClient httpclient = clientbuilder.build();
ステップ8-HttpGetオブジェクトを作成する
ザ・ HttpGet クラスは、URIを使用して指定されたサーバーの情報を取得するHTTPGETリクエストを表します。
URIを表す文字列を渡してHttpGetクラスをインスタンス化することにより、HTTPGETリクエストを作成します。
//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