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

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

1. обзор

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

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

Дальнейшее чтение:

Автоматическая настройка безопасности Spring Boot

Краткое и практическое руководство по настройке Spring Security по умолчанию в Spring Boot.

Read more

Введение в Java Config для Spring Security

Краткое и практическое руководство по Java Config для Spring Security

Read more

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
Related