HTTPS menggunakan Self-Signed Certificate di Spring Boot

1. Ikhtisar

Dalam tutorial ini, kami akan menunjukkan cara mengaktifkan HTTPS di Spring Boot. Untuk tujuan ini, kami juga akan membuat sertifikat yang ditandatangani sendiri dan mengonfigurasi aplikasi sederhana.

Untuk detail lebih lanjut tentang proyek Spring Boot, kami dapat merujuk ke banyak sumber daya di sini.

2. Membuat Sertifikat yang Ditandatangani Sendiri

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

  • PKCS12: Standar Kriptografi Kunci Publik adalah format yang dilindungi kata sandi yang dapat berisi banyak sertifikat dan kunci; ini adalah format yang digunakan di seluruh industri
  • JKS: Java KeyStore mirip dengan PKCS12; itu adalah format kepemilikan dan terbatas pada lingkungan Java.

Kita dapat menggunakan salah satu alat keytool atau OpenSSL untuk menghasilkan sertifikat dari baris perintah. Keytool dikirimkan dengan Java Runtime Environment dan OpenSSL dapat diunduh dari sini.

Mari gunakan alat kunci untuk demonstrasi kita.

2.1. Menghasilkan Keystore

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

Kita dapat menggunakan perintah berikut untuk menghasilkan format keystore PKCS12 kita:

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

Kita bisa menyimpan sebanyak mungkin pasangan kunci di keystore yang sama, masing-masing diidentifikasi oleh alias unik.

Untuk membuat keystore kami dalam format JKS, kami dapat menggunakan perintah berikut:

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

Direkomendasikan untuk menggunakan format PKCS12 yang merupakan format standar industri. Jadi jika kita sudah memiliki keystore JKS, kita dapat mengubahnya menjadi format PKCS12 menggunakan perintah berikut:

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

Kami harus memberikan kata sandi keystore sumber dan juga menyetel kata sandi keystore baru. Alias ​​dan kata sandi keystore akan dibutuhkan nanti.

3. Mengaktifkan HTTPS di Spring Boot

Spring Boot menyediakan satu set properti server.ssl. * Deklaratif. Kami akan menggunakan properti tersebut di aplikasi sampel kami untuk mengonfigurasi HTTPS.

Kita akan mulai dari aplikasi Spring Boot sederhana dengan Spring Security yang berisi halaman selamat datang yang ditangani oleh endpoint " / welcome ".

Kemudian, kita akan menyalin file bernama “ baeldung.p12 ″ yang dibuat pada langkah sebelumnya ke direktori “ src / main / resources / keystore ”.

3.1. Mengonfigurasi Properti SSL

Sekarang, kami akan mengonfigurasi properti terkait 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

Karena kami menggunakan aplikasi yang mendukung Keamanan Musim Semi, mari konfigurasikan untuk menerima hanya permintaan HTTPS:

server.ssl.enabled=true

4. Memanggil URL HTTPS

Sekarang setelah kita mengaktifkan HTTPS di aplikasi kita, mari kita lanjutkan ke klien dan mari kita jelajahi cara memanggil titik akhir HTTPS dengan sertifikat yang ditandatangani sendiri.

Pertama, kita perlu membuat toko kepercayaan. Karena kami telah membuat file PKCS12, kami dapat menggunakan yang sama dengan penyimpanan kepercayaan. Mari tentukan properti baru untuk detail trust store:

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

Sekarang kita perlu menyiapkan SSLContext 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, pastikan Spring Security mengizinkan semua permintaan masuk:

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

Terakhir, kita dapat melakukan 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, pertama-tama kami mempelajari cara membuat sertifikat yang ditandatangani sendiri untuk mengaktifkan HTTPS di aplikasi Spring Boot. Selain itu, kami menunjukkan cara memanggil titik akhir yang mendukung HTTPS.

Seperti biasa, kami dapat menemukan kode sumber lengkap di repositori GitHub.

Terakhir, untuk menjalankan contoh kode, kita perlu menghapus komentar properti kelas-awal berikut di pom.xml :

com.baeldung.ssl.HttpsEnabledApplication