Spring Bootで自己署名証明書を使ったHTTPS

Spring Bootで自己署名証明書を使用するHTTPS

1. 概要

このチュートリアルでは、SpringBootアプリケーションでHTTPSを有効にする例を段階的に説明します。

自己署名証明書を生成し、サンプルアプリで構成します。 Spring Bootプロジェクトの詳細については、一連のリソースhereを参照できます。

参考文献:

スプリングブートセキュリティの自動構成

SpringBootのデフォルトのSpringSecurity構成に関する迅速で実用的なガイド。

Spring SecurityのJava Configの概要

Spring SecurityのJava Configの迅速で実用的なガイド

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