Spring Bootで自己署名証明書を使用するHTTPS
1. 概要
このチュートリアルでは、SpringBootアプリケーションでHTTPSを有効にする例を段階的に説明します。
自己署名証明書を生成し、サンプルアプリで構成します。 Spring Bootプロジェクトの詳細については、一連のリソースhereを参照できます。
参考文献:
2. 自己署名証明書の生成
始める前に、自己署名証明書を作成します。 次の証明書形式のいずれかを使用します。
-
PKCS12:Public Key Cryptographic Standardsはパスワードで保護された形式であり、複数の証明書とキーを含めることができます。業界全体で使用されている形式です
-
JKS:Java KeyStoreはPKCS12に似ています。これは独自の形式であり、Java環境に限定されています。
keytoolまたはOpenSSLツールのいずれかを使用して、コマンドラインから証明書を生成できます。 KeytoolはJavaランタイム環境に付属しており、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. SpringBootでHTTPSを有効にする
Spring Bootは、一連の宣言型server.ssl.* properties.を提供します。サンプルアプリケーションでこれらのプロパティを構成して、HTTPSを構成します。
まず、「/welcome」エンドポイントによって処理されるウェルカムページを含む単純なSpring Bootアプリケーションwith Spring Securityから始めます。
前の手順で生成された「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. HTTPSURLの呼び出し
アプリケーションで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. 結論
チュートリアルでは、Spring BootアプリケーションでHTTPSを有効にする自己署名証明書を生成する方法について学びました。 また、HTTPS対応のエンドポイントを呼び出す方法も学びました。
いつものように、完全なソースコードはGitHub repositoryにあります。
最後に、コードサンプルを実行するには、pom.xmlの次のstart-classプロパティのコメントを解除する必要があります。
org.example.ssl.HttpsEnabledApplication