Apache-httpclient-custom-ssl-context

提供:Dev Guides
移動先:案内検索

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オブジェクトと NoopH​​ostnameVerifier オブジェクトを渡すことで 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