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). Загрузите файл хранилища ключей и его пароль (который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

SSLConnectionSocketFactoryпредставляет собой многоуровневую фабрику сокетов для соединений TSL и 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 Класс представляет собой 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);
      } 
   }
}

Выход

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

HTTP/1.1 200 OK
1270