Перейти к основному содержимому

HTTPS с использованием самозаверяющего сертификата в Spring Boot

· 4 мин. чтения

1. Обзор

В этом руководстве мы узнаем, как включить HTTPS в Spring Boot. Для этого мы также сгенерируем самозаверяющий сертификат и настроим простое приложение.

Для получения более подробной информации о проектах Spring Boot мы можем обратиться к множеству ресурсов здесь .

2. Генерация самоподписанного сертификата

Прежде чем начать, мы создадим самозаверяющий сертификат. Мы будем использовать любой из следующих форматов сертификатов:

Мы можем использовать инструменты keytool или OpenSSL для создания сертификатов из командной строки. Keytool поставляется с Java Runtime Environment, а OpenSSL можно скачать отсюда .

Для нашей демонстрации воспользуемся keytool.

2.1. Создание хранилища ключей

Теперь мы создадим набор криптографических ключей и сохраним их в хранилище ключей.

Мы можем использовать следующую команду для создания нашего формата хранилища ключей PKCS12:

keytool -genkeypair -alias foreach -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore foreach.p12 -validity 3650

Мы можем хранить любое количество пар ключей в одном и том же хранилище ключей, каждый из которых идентифицируется уникальным псевдонимом.

Для создания нашего хранилища ключей в формате JKS мы можем использовать следующую команду:

keytool -genkeypair -alias foreach -keyalg RSA -keysize 2048 -keystore foreach.jks -validity 3650

Мы рекомендуем использовать формат PKCS12, который является отраслевым стандартом. Поэтому, если у нас уже есть хранилище ключей JKS, мы можем преобразовать его в формат PKCS12 с помощью следующей команды:

keytool -importkeystore -srckeystore foreach.jks -destkeystore foreach.p12 -deststoretype pkcs12

Нам нужно будет указать исходный пароль хранилища ключей, а также установить новый пароль хранилища ключей. Псевдоним и пароль хранилища ключей понадобятся позже.

3. Включение HTTPS в Spring Boot

Spring Boot предоставляет набор декларативных свойств server.ssl.* . Мы будем использовать эти свойства в нашем примере приложения для настройки HTTPS.

Мы начнем с простого приложения Spring Boot с Spring Security , которое содержит страницу приветствия, обрабатываемую конечной точкой « /welcome ».

Затем мы скопируем файл с именем « foreach.p12», созданный на предыдущем шаге, в каталог « src/main/resources/keystore ».

3.1. Настройка свойств SSL

Теперь мы настроим свойства, связанные с SSL:

# The format used for the keystore. It could be set to JKS in case it is a JKS file
server.ssl.key-store-type=PKCS12
# The path to the keystore containing the certificate
server.ssl.key-store=classpath:keystore/foreach.p12
# The password used to generate the certificate
server.ssl.key-store-password=password
# The alias mapped to the certificate
server.ssl.key-alias=foreach

Поскольку мы используем приложение с поддержкой Spring Security, давайте настроим его для приема только HTTPS-запросов:

server.ssl.enabled=true

4. Вызов URL-адреса HTTPS

Теперь, когда мы включили HTTPS в нашем приложении, давайте перейдем к клиенту и рассмотрим, как вызвать конечную точку HTTPS с самоподписанным сертификатом.

Во-первых, нам нужно создать хранилище доверия. Поскольку мы создали файл PKCS12, мы можем использовать его в качестве хранилища доверия. Давайте определим новые свойства для деталей хранилища доверия:

#trust store location
trust.store=classpath:keystore/foreach.p12
#trust store password
trust.store.password=password

Затем нам нужно подготовить SSLContext с доверенным хранилищем и создать настроенный RestTemplate:

RestTemplate restTemplate() throws Exception {
SSLContext sslContext = new SSLContextBuilder()
.loadTrustMaterial(trustStore.getURL(), trustStorePassword.toCharArray())
.build();
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext);
HttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(socketFactory)
.build();
HttpComponentsClientHttpRequestFactory factory =
new HttpComponentsClientHttpRequestFactory(httpClient);
return new RestTemplate(factory);
}

Ради демонстрации давайте удостоверимся, что Spring Security разрешает любые входящие запросы:

protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/**")
.permitAll();
}

Наконец, мы можем сделать вызов конечной точке HTTPS:

@Test
public void whenGETanHTTPSResource_thenCorrectResponse() throws Exception {
ResponseEntity<String> response =
restTemplate().getForEntity(WELCOME_URL, String.class, Collections.emptyMap());

assertEquals("<h1>Welcome to Secured Site</h1>", response.getBody());
assertEquals(HttpStatus.OK, response.getStatusCode());
}

5. Вывод

В этой статье мы впервые узнали, как создать самозаверяющий сертификат для включения HTTPS в приложении Spring Boot. Затем мы обсудили, как вызвать конечную точку с поддержкой HTTPS.

Как всегда, мы можем найти полный исходный код в репозитории GitHub .

Наконец, чтобы запустить пример кода, нам нужно раскомментировать следующее свойство начального класса в pom.xml :

<start-class>com.foreach.ssl.HttpsEnabledApplication</start-class>