Учебники

Apache HttpClient — пользовательский контекст SSL

Используя Secure Socket Layer, вы можете установить защищенное соединение между клиентом и сервером. Это помогает защитить конфиденциальную информацию, такую ​​как номера кредитных карт, имена пользователей, пароли, булавки и т. Д.

Вы можете сделать соединения более безопасными, создав собственный контекст SSL с помощью библиотеки HttpClient .

Выполните шаги, указанные ниже, чтобы настроить SSLContext с помощью библиотеки HttpClient —

Шаг 1 — Создайте объект SSLContextBuilder

SSLContextBuilder является компоновщиком объектов SSLContext. Создайте его объект, используя метод custom () класса SSLContexts .

//Creating SSLContextBuilder object
SSLContextBuilder SSLBuilder = SSLContexts.custom();

Шаг 2 — Загрузите хранилище ключей

В пути Java_home_directory / jre / lib / security / вы можете найти файл с именем cacerts. Сохраните его как файл хранилища ключей (с расширением .jks). Загрузите файл хранилища ключей и его пароль (который по умолчанию изменен ) с помощью метода 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

SSLConnectionSocketFactory — это многоуровневая фабрика сокетов для соединений TSL и SSL. Используя это, вы можете проверить сервер Https, используя список доверенных сертификатов, и аутентифицировать данный сервер Https.

Вы можете создать это разными способами. В зависимости от способа создания объекта SSLConnectionSocketFactory вы можете разрешить все узлы, разрешить только самозаверяющие сертификаты, разрешить только определенные протоколы и т. Д.

Чтобы разрешить только определенные протоколы , создайте объект SSLConnectionSocketFactory , передав объект SSLContext, строковый массив, представляющий протоколы, должны поддерживаться, строковый массив, представляющий костюмы шифров, должен поддерживаться, и объект HostnameVerifier его конструктору.

new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1"}, null,    
   SSLConnectionSocketFactory.getDefaultHostnameVerifier());

Чтобы разрешить все хосты, создайте объект 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 представляет HTTP-запрос GET, который извлекает информацию о данном сервере с использованием URI.

Создайте HTTP-запрос GET, создав экземпляр класса HttpGet, передав строку, представляющую URI.

//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);
      } 
   }
}

Выход

При выполнении вышеупомянутая программа генерирует следующий вывод.