HTTPS, използващ самоподписан сертификат при пролетно зареждане

1. Общ преглед

В този урок ще покажем как да активирате HTTPS в Spring Boot. За тази цел ще генерираме и самоподписан сертификат и ще конфигурираме просто приложение.

За повече подробности относно проектите на Spring Boot можем да се обърнем към куп ресурси тук.

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

Преди да започнем, ще създадем самоподписан сертификат. Ще използваме някой от следните формати на сертификати:

  • PKCS12: Криптографските стандарти с публичен ключ е защитен с парола формат, който може да съдържа множество сертификати и ключове; това е използван формат за цялата индустрия
  • JKS: Java KeyStore е подобен на PKCS12; това е патентован формат и е ограничен до Java среда.

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

Нека използваме инструмента за клавиши за нашата демонстрация.

2.1. Генериране на Keystore

Сега ще създадем набор от криптографски ключове и ще го съхраним в магазин за ключове.

Можем да използваме следната команда за генериране на нашия формат за хранилище на ключове 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

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. Извикване на HTTPS URL адрес

След като активирахме 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 { ResponseEntity response = restTemplate().getForEntity(WELCOME_URL, String.class, Collections.emptyMap()); assertEquals("", response.getBody()); assertEquals(HttpStatus.OK, response.getStatusCode()); }

5. Заключение

В урока първо научихме как да генерираме самоподписан сертификат, за да активираме HTTPS в приложение за пролетно стартиране. Освен това показахме как да се извика HTTPS-активирана крайна точка.

Както винаги, можем да намерим пълния изходен код в хранилището на GitHub.

И накрая, за да стартираме пробата на кода, трябва да деактивираме следното свойство start-class в pom.xml :

com.baeldung.ssl.HttpsEnabledApplication