HTTPS с использованием самоподписанного сертификата в Spring Boot
1. обзор
В этом руководстве мы шаг за шагом проиллюстрируем пример включения HTTPS в приложении Spring Boot.
Мы создадим самозаверяющий сертификат и настроим его в примере приложения. Для получения дополнительной информации о проектах Spring Boot мы можем обратиться к группе ресурсовhere.
Дальнейшее чтение:
Автоматическая настройка безопасности Spring Boot
Краткое и практическое руководство по настройке Spring Security по умолчанию в Spring Boot.
Введение в Java Config для Spring Security
Краткое и практическое руководство по Java Config для Spring Security
2. Создание самозаверяющего сертификата
Прежде чем начать, мы создадим самозаверяющий сертификат. Мы будем использовать любой из следующих форматов сертификатов:
-
PKCS12:Public Key Cryptographic Standards - это защищенный паролем формат, который может содержать несколько сертификатов и ключей; это широко используемый формат
-
JKS:Java KeyStore похож на PKCS12; это частный формат, ограниченный средой Java.
Мы можем использовать инструмент keytool или OpenSSL для генерации сертификатов из командной строки. Keytool поставляется с Java Runtime Environment, а OpenSSL можно загрузить сhere.
Давайте использовать keytool для нашей демонстрации.
2.1. Создание хранилища ключей
Теперь мы создадим набор криптографических ключей и сохраним его в хранилище ключей.
Мы можем использовать следующую команду для генерации нашего формата хранилища ключей PKCS12:
keytool -genkeypair -alias example -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore example.p12 -validity 3650
Мы можем хранить столько же пар ключей в одном и том же хранилище ключей, каждое из которых идентифицируется уникальным псевдонимом.
Для генерации нашего хранилища ключей в формате JKS мы можем использовать следующую команду:
keytool -genkeypair -alias example -keyalg RSA -keysize 2048 -keystore example.jks -validity 3650
Рекомендуется использовать формат PKCS12, который является отраслевым стандартом. Поэтому, если у нас уже есть хранилище ключей JKS, мы можем преобразовать его в формат PKCS12, используя следующую команду:
keytool -importkeystore -srckeystore example.jks -destkeystore example.p12 -deststoretype pkcs12
Нам нужно будет предоставить исходный пароль хранилища ключей, а также установить новый пароль хранилища ключей. Псевдоним и пароль хранилища ключей понадобятся позже.
3. Включение HTTPS в Spring Boot
Spring Boot предоставляет набор декларативныхserver.ssl.* properties.. Мы настроим эти свойства в нашем примере приложения для настройки HTTPS.
Мы начнем с простого приложения Spring Bootwith Spring Security, содержащего страницу приветствия, обрабатываемую конечной точкой «/welcome».
Мы скопируем файл с именем «example.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/example.p12
# The password used to generate the certificate
server.ssl.key-store-password=password
# The alias mapped to the certificate
server.ssl.key-alias=example
Поскольку мы используем приложение с поддержкой Spring Security, давайте настроим его на прием только HTTPS-запросов:
security.require-ssl=true
4. Вызов URL-адреса HTTPS
Теперь, когда мы включили HTTPS в нашем приложении, перейдем к клиенту и посмотрим, как вызвать конечную точку HTTPS с помощью самозаверяющего сертификата.
Во-первых, нам нужно создать трастовый магазин. Поскольку мы создали файл PKCS12, мы можем использовать то же самое, что и хранилище доверенных сертификатов. Давайте определим новые свойства для деталей доверенного хранилища:
#trust store location
trust.store=classpath:keystore/example.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 response =
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 repository.
Наконец, чтобы запустить образец кода, нам нужно не комментировать следующее свойство start-class вpom.xml:
org.example.ssl.HttpsEnabledApplication