HTTPS menggunakan Sijil Tanda Diri dalam Spring Boot

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan menunjukkan cara mengaktifkan HTTPS di Spring Boot. Untuk tujuan ini, kami juga akan menghasilkan sijil yang ditandatangani sendiri dan mengkonfigurasi aplikasi mudah.

Untuk maklumat lebih lanjut mengenai projek Spring Boot, kami boleh merujuk kepada banyak sumber di sini.

2. Menghasilkan Sijil Tandatangan Sendiri

Sebelum memulakan, kami akan membuat sijil yang ditandatangani sendiri. Kami akan menggunakan salah satu format sijil berikut:

  • PKCS12: Piawai Kriptografi Kunci Awam adalah format dilindungi kata laluan yang boleh mengandungi pelbagai sijil dan kunci; ini adalah format terpakai di seluruh industri
  • JKS: Java KeyStore serupa dengan PKCS12; ini adalah format proprietari dan terhad kepada persekitaran Java.

Kita boleh menggunakan alat keytool atau OpenSSL untuk menghasilkan sijil dari baris arahan. Keytool dihantar dengan Java Runtime Environment dan OpenSSL boleh dimuat turun dari sini.

Mari gunakan keytool untuk demonstrasi kami.

2.1. Menjana Kedai Kunci

Sekarang kita akan membuat satu set kunci kriptografi dan menyimpannya di kedai kunci.

Kami boleh menggunakan perintah berikut untuk menghasilkan format kunci PKCS12 kami:

keytool -genkeypair -alias baeldung -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore baeldung.p12 -validity 3650

Kita boleh menyimpan sebilangan besar pasangan kunci di kedai kunci yang sama yang masing-masing dikenal pasti dengan alias unik.

Untuk menghasilkan kedai kunci kami dalam format JKS, kami dapat menggunakan perintah berikut:

keytool -genkeypair -alias baeldung -keyalg RSA -keysize 2048 -keystore baeldung.jks -validity 3650

Sebaiknya gunakan format PKCS12 yang merupakan format standard industri. Jadi sekiranya kita sudah mempunyai kedai kunci JKS, kita boleh menukarnya ke format PKCS12 menggunakan perintah berikut:

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

Kita mesti memberikan kata laluan stor kunci sumber dan juga menetapkan kata laluan kedai kunci baru. Kata laluan alias dan kedai kunci akan diperlukan kemudian.

3. Mengaktifkan HTTPS dalam Spring Boot

Spring Boot menyediakan satu set sifat server.ssl. * Deklaratif. Kami akan menggunakan sifat tersebut dalam aplikasi sampel kami untuk mengkonfigurasi HTTPS.

Kami akan bermula dari aplikasi Spring Boot sederhana dengan Spring Security yang mengandungi halaman selamat datang yang dikendalikan oleh titik akhir " / welcome ".

Kemudian, kami akan menyalin fail bernama " baeldung.p12" yang dihasilkan pada langkah sebelumnya ke dalam direktori " src / main / resources / keystore ".

3.1. Mengkonfigurasi Properties SSL

Sekarang, kami akan mengkonfigurasi sifat yang berkaitan dengan 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

Oleh kerana kami menggunakan aplikasi Spring Security, mari konfigurasikannya untuk menerima permintaan HTTPS sahaja:

server.ssl.enabled=true

4. Memohon URL HTTPS

Sekarang kita telah mengaktifkan HTTPS dalam aplikasi kita, mari beralih ke klien dan mari kita meneroka cara menggunakan titik akhir HTTPS dengan sijil yang ditandatangani sendiri.

Pertama, kita perlu membuat kedai amanah. Oleh kerana kami telah menghasilkan fail PKCS12, kami dapat menggunakan yang sama seperti trust store Mari tentukan hartanah baru untuk perincian kedai amanah:

#trust store location trust.store=classpath:keystore/baeldung.p12 #trust store password trust.store.password=password

Sekarang kita perlu menyediakan SSLConteks dengan trust store dan membuat RestTemplate yang disesuaikan :

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); }

Demi demo, mari kita pastikan Spring Security membenarkan sebarang permintaan masuk:

protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/**") .permitAll(); }

Akhirnya, kita dapat membuat panggilan ke titik akhir 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. Kesimpulan

Dalam tutorial tersebut, kami pertama kali belajar bagaimana menghasilkan sijil yang ditandatangani sendiri untuk mengaktifkan HTTPS dalam aplikasi Spring Boot. Selain itu, kami menunjukkan cara menggunakan titik akhir yang didayakan HTTPS.

Seperti biasa, kita dapat mencari kod sumber yang lengkap di repositori GitHub.

Akhirnya, untuk menjalankan contoh kod, kita perlu membatalkan komen hartanah kelas permulaan berikut di pom.xml :

com.baeldung.ssl.HttpsEnabledApplication