HTTPS pomoću samopotpisanog certifikata u proljetnom pokretanju

1. Pregled

U ovom uputstvu pokazat ćemo kako omogućiti HTTPS u Spring Boot-u. U tu svrhu generirat ćemo i samopotpisani certifikat i konfigurirati jednostavnu aplikaciju.

Za više detalja o projektima Spring Boot, ovdje se možete osvrnuti na hrpu resursa.

2. Izrada samopotpisanog certifikata

Prije početka stvorit ćemo samopotpisanu potvrdu. Upotrijebit ćemo jedan od sljedećih formata certifikata:

  • PKCS12: Kriptografski standardi s javnim ključem zaštićen je lozinkom format koji može sadržavati više certifikata i ključeva; to je format koji se koristi u cijeloj industriji
  • JKS: Java KeyStore sličan je PKCS12; vlasnički je format i ograničen je na Java okruženje.

Za generiranje certifikata iz naredbenog retka možemo koristiti alatku keytool ili OpenSSL. Keytool se isporučuje s Java Runtime Environmentom, a OpenSSL se može preuzeti ovdje.

Upotrijebimo alat za ključeve za našu demonstraciju.

2.1. Generiranje pohrane ključeva

Sada ćemo stvoriti skup kriptografskih ključeva i pohraniti ga u pohranu ključeva.

Sljedeću naredbu možemo koristiti za generiranje našeg formata pohrane ključeva PKCS12:

keytool -genkeypair -alias baeldung -keyalg RSA -keyys 2048 -tip tipa PKCS12-keystore baeldung.p12 -validnost 3650

U istu pohranu ključeva možemo pohraniti što više brojeva parova ključeva, a svaki je identificiran jedinstvenim zamjenskim imenom.

Za generiranje naše pohrane ključeva u JKS formatu možemo upotrijebiti sljedeću naredbu:

keytool -genkeypair -alias baeldung -keyalg RSA -keyys 2048 -keystore baeldung.jks -validnost 3650

Preporučuje se korištenje formata PKCS12 koji je industrijski standardni format. Dakle, u slučaju da već imamo JKS pohranu ključeva, možemo je pretvoriti u PKCS12 format pomoću sljedeće naredbe:

keytool -importkeystore -srckeystore baeldung.jks -destkeystore baeldung.p12 -deststoretip pkcs12

Morat ćemo navesti izvornu lozinku za pohranu ključeva i postaviti novu lozinku za pohranu ključeva. Zamjenski naziv i lozinka za pohranu ključeva bit će potrebni kasnije.

3. Omogućavanje HTTPS-a u Spring Boot-u

Spring Boot nudi skup deklarativnih stavki svojstva poslužitelja.ssl. *. Upotrijebit ćemo ta svojstva u našem primjeru aplikacije za konfiguriranje HTTPS-a.

Krenut ćemo od jednostavne aplikacije Spring Boot s Spring Security koja sadrži stranicu dobrodošlice kojom upravlja "/Dobrodošli”Krajnja točka.

Zatim ćemo kopirati datoteku pod nazivom “baeldung.p12 ″ generiran u prethodnom koraku u "src / main / resources / keystore”Imenik.

3.1. Konfiguriranje SSL svojstava

Sada ćemo konfigurirati svojstva povezana sa SSL-om:

# Format koji se koristi za pohranu ključeva. Može se postaviti na JKS u slučaju da je riječ o datoteci JKS server.ssl.key-store-type = PKCS12 # Put do spremišta ključeva koji sadrži certifikat server.ssl.key-store = classpath: keystore / baeldung.p12 # The lozinka korištena za generiranje poslužitelja certifikata.ssl.key-store-password = password # Alias ​​mapiran na server certifikata.ssl.key-alias = baeldung

Budući da koristimo aplikaciju s omogućenom Spring Security, konfigurirajmo je da prihvaća samo HTTPS zahtjeve:

server.ssl.enabled = true

4. Pozivanje HTTPS URL-a

Sad kad smo u svojoj aplikaciji omogućili HTTPS, prijeđimo na klijenta i istražimo kako pozvati HTTPS krajnju točku samopotpisanim certifikatom.

Prvo, moramo stvoriti trgovinu povjerenja. Kako smo generirali PKCS12 datoteku, možemo koristiti isto što i skladište povjerenja. Definirajmo nova svojstva za detalje trgovine povjerenja:

#trust lokacija pohrane trust.store = put puta: spremište ključeva / baeldung.p12 #pouzdanje trgovine lozinka trust.store.password = lozinka

Sada moramo pripremiti SSLContext s trgovinom povjerenja i stvorite prilagođenu Predložak za odmor:

RestTemplate restTemplate () baca izuzetak {SSLContext sslContext = new SSLContextBuilder () .loadTrustMaterial (trustStore.getURL (), trustStorePassword.toCharArray ()) .build (); SSLConnectionSocketFactory socketFactory = novi SSLConnectionSocketFactory (sslContext); HttpClient httpClient = HttpClients.custom () .setSSLSocketFactory (socketFactory) .build (); HttpComponentsClientHttpRequestFactory tvornica = novo HttpComponentsClientHttpRequestFactory (httpClient); vratiti novi RestTemplate (tvornički); }

Zarad demo, pobrinimo se Proljetna sigurnost dopušta sve dolazne zahtjeve:

zaštićena void konfiguracija (HttpSecurity http) baca Exception {http.authorizeRequests () .antMatchers ("/ **") .permitAll (); }

Napokon, možemo uputiti poziv krajnjoj točki HTTPS:

@Test public void whenGETanHTTPSResource_thenCorrectResponse () baca izuzetak {ResponseEntity response = restTemplate (). GetForEntity (WELCOME_URL, String.class, Collections.emptyMap ()); assertEquals ("", response.getBody ()); assertEquals (HttpStatus.OK, response.getStatusCode ()); }

5. Zaključak

U vodiču smo prvo naučili kako generirati samopotpisan certifikat za omogućavanje HTTPS-a u aplikaciji Spring Boot. Osim toga, pokazali smo kako pozivati ​​krajnju točku s omogućenim HTTPS-om.

Kao i uvijek, kompletni izvorni kod možemo pronaći na GitHub spremištu.

Napokon, da bismo pokrenuli uzorak koda, moramo ukloniti komentar iz sljedećeg svojstva start-class u pom.xml:

com.baeldung.ssl.HttpsEnabledApplication