1. Обзор
В этом руководстве мы узнаем, как включить HTTPS в Spring Boot. Для этого мы также сгенерируем самозаверяющий сертификат и настроим простое приложение.
Для получения более подробной информации о проектах Spring Boot мы можем обратиться к множеству ресурсов здесь .
2. Генерация самоподписанного сертификата
Прежде чем начать, мы создадим самозаверяющий сертификат. Мы будем использовать любой из следующих форматов сертификатов:
- PKCS12: Стандарты криптографии с открытым ключом — это защищенный паролем формат, который может содержать несколько сертификатов и ключей; это широко используемый в отрасли формат.
- JKS: хранилище ключей Java похоже на PKCS12; это проприетарный формат, ограниченный средой Java.
Мы можем использовать инструменты 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>