1. Обзор
В этом уроке мы покажем, как включить HTTPS в Spring Boot. Для этой цели мы также создадим самозаверяющий сертификат и настроим простое приложение.
Для получения более подробной информации о проектах Spring Boot мы можем обратиться к куче ресурсов здесь .
Дальнейшее чтение:
Автоматическая настройка безопасности весенней загрузки
Введение в Java Config для безопасности Spring
2. Создание Самозаверяющего сертификата
Прежде чем приступить к работе, мы создадим самозаверяющий сертификат. Мы будем использовать любой из следующих форматов сертификатов:
- PKCS12: Криптографические стандарты с открытым ключом -это защищенный паролем формат, который может содержать несколько сертификатов и ключей; это широко используемый в отрасли формат
- JKS: Хранилище ключей Java похоже на PKCS12; это проприетарный формат и ограничен средой Java.
Мы можем использовать инструменты keytool или OpenSSL для создания сертификатов из командной строки. Key tool поставляется с Java Runtime Environment, и OpenSSL можно загрузить из здесь .
Давайте используем keytool для нашей демонстрации.
2.1. Создание хранилища ключей
Теперь мы создадим набор криптографических ключей и сохраним его в хранилище ключей.
Мы можем использовать следующую команду для создания нашего формата хранилища ключей PKCS12:
keytool -genkeypair -alias baeldung -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore baeldung.p12 -validity 3650
Мы можем хранить столько номеров пар ключей в одном и том же хранилище ключей, каждый из которых идентифицируется уникальным псевдонимом.
Для создания нашего хранилища ключей в формате JKS мы можем использовать следующую команду:
keytool -genkeypair -alias baeldung -keyalg RSA -keysize 2048 -keystore baeldung.jks -validity 3650
Рекомендуется использовать формат PKCS12, который является стандартным форматом отрасли. Поэтому, если у нас уже есть хранилище ключей JKS, мы можем преобразовать его в формат PKCS12 с помощью следующей команды:
keytool -importkeystore -srckeystore baeldung.jks -destkeystore baeldung.p12 -deststoretype pkcs12
Нам нужно будет указать исходный пароль хранилища ключей, а также установить новый пароль хранилища ключей. Псевдоним и пароль хранилища ключей понадобятся позже.
3. Включение HTTPS в весенней загрузке
Spring Boot предоставляет набор декларативных server.ssl.* свойств . Мы будем использовать эти свойства в нашем примере приложения для настройки HTTPS.
Мы начнем с простого приложения Spring Boot с Spring Security , которое содержит страницу приветствия, обрабатываемую конечной точкой ” /welcome “.
Затем мы скопируем файл с именем ” baeldung.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/baeldung.p12 # The password used to generate the certificate server.ssl.key-store-password=password # The alias mapped to the certificate server.ssl.key-alias=baeldung
Поскольку мы используем приложение с поддержкой Spring Security, давайте настроим его на прием только HTTPS-запросов:
server.ssl.enabled=true
4. Вызов URL-адреса HTTPS
Теперь, когда мы включили HTTPS в нашем приложении, давайте перейдем к клиенту и рассмотрим, как вызвать конечную точку HTTPS с помощью самозаверяющего сертификата.
Во-первых, нам нужно создать рейтинг доверия. Поскольку мы создали файл PKCS12, мы можем использовать то же самое, что и хранилище доверия. Давайте определим новые свойства для сведений о доверительном хранилище:
#trust store location trust.store=classpath:keystore/baeldung.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 { ResponseEntityresponse = restTemplate().getForEntity(WELCOME_URL, String.class, Collections.emptyMap()); assertEquals(" Welcome to Secured Site
", response.getBody()); assertEquals(HttpStatus.OK, response.getStatusCode()); }
5. Заключение
В этом руководстве мы впервые узнали, как создать самозаверяющий сертификат для включения HTTPS в приложении Spring Boot. Кроме того, мы показали, как вызвать конечную точку с поддержкой HTTPS.
Как всегда, мы можем найти полный исходный код в репозитории GitHub .
Наконец, чтобы запустить пример кода, нам нужно раскомментировать следующее свойство начального класса в pom.xml :
com.baeldung.ssl.HttpsEnabledApplication