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