Используя 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); } } }
Выход
При выполнении вышеупомянутая программа генерирует следующий вывод.