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