1. Введение
В этом кратком руководстве мы настроим Spring WebClient для HTTPS-запросов.
Когда мы защищаем HTTP‑связь с помощью шифрования, злоумышленникам становится сложнее изменять данные пользователей. Сегодня это по умолчанию для большинства современных приложений, интегрирующихся с другими сервисами.
В этом руководстве мы начнём с проверки certificate и key file, а затем перейдём к настройке Spring WebClient.
2. Проверка Certificate and Key Files
Сначала мы проверим, что наш certificate и key file имеют одинаковый MD5. Это гарантирует, что certificate и key не были изменены.
Мы можем использовать openssl для отображения MD5 hash:
openssl x509 -noout -modulus -in yourCertificate.crt | openssl md5
Аналогично, мы можем проделать то же самое для key file:
openssl rsa -noout -modulus -in yourPrivateKey.key | openssl md5
Совпадающие результаты обеих команд подтверждают, что наши certificate и key соответствуют друг другу.
Мы можем протестировать certificate и key с помощью CURL:
curl -v --cert yourCertificate.crt --key yourPrivateKey.key https://yourEndpoint.com
Теперь мы можем перейти к конвертации certificate и key в формат PKCS12.
3. Преобразование сертификата и ключа в формат PKCS12
Чтобы настроить Spring WebClient, нам нужно конвертировать сертификат в формат PKCS12.
Снова давайте воспользуемся openssl, чтобы получить файл в формате PKCS12:
openssl pkcs12 -export -in yourCertificate.crt -inkey yourPrivateKey.key -out certificate.p12
При выполнении приведённой выше команды нам будет предложено создать пароль. Введите любой понравившийся пароль и сохраните его в надёжном месте — мы снова будем использовать его при настройке SslContext для WebClient.
Теперь у нас есть файл certificate.p12, который мы можем использовать для настройки нашего приложения.
4. Настройка SSLContext
Наконец, мы можем создать SslContext, который читает ранее созданный файл и использует password, который мы задали.
Мы будем использовать SslContextBuilder для создания SslContext:
SslContext sslContext = SslContextBuilder.forClient().keyManager(
new FileInputStream("pathToP12CertificateFile"),
"password".toCharArray()).build();
Теперь sslContext можно использовать для создания WebClient bean, который позволит нам выполнять безопасные HTTPS-вызовы:
@Bean
private WebClient getSecureWebClient() {
HttpClient httpClient = HttpClient.create().secure(sslSpec -> sslSpec.sslContext(getSSLContext()));
ClientHttpConnector clientHttpConnector = new ReactorClientHttpConnector(httpClient);
return WebClient.builder()
.clientConnector(clientHttpConnector)
.build();
}
Использовать этот WebClient для выполнения защищённых HTTPS-запросов так же просто, как внедрить bean WebClient в наш сервис:
@Service
public class MyService {
private final WebClient webClient;
public MyService(WebClient webClient) {
this.webClient = webClient;
}
public Mono<String> getSecureData() {
return webClient.get()
.uri("https://yourEndpoint.com")
.retrieve()
.bodyToMono(String.class);
}
}
На самом деле нам не нужно делать ничего особенного в нашем сервисе, чтобы выполнять безопасные HTTPS-запросы. WebClient bean, который мы создали, обо всём позаботится.
5. Заключение
В этом руководстве мы конвертировали файл сертификата и файл ключа в формат PKCS12 и настроили WebClient для выполнения защищённых HTTPS-запросов. Наконец, мы показали, как можем использовать WebClient для выполнения защищённых HTTPS-запросов в нашем сервисе.


