SSL

Spring Boot は、安全な通信をサポートするために、いくつかの種類の接続に適用できる SSL 信頼マテリアルを構成する機能を提供します。プレフィックス spring.ssl.bundle が付いた構成プロパティを使用して、信頼マテリアルと関連情報の名前付きセットを指定できます。

Java KeyStore ファイルを使用した SSL の構成

プレフィックス spring.ssl.bundle.jks の付いた構成プロパティを使用すると、Java keytool ユーティリティで作成され、JKS または PKCS12 形式の Java KeyStore ファイルに保存された信頼マテリアルのバンドルを構成できます。各バンドルには、バンドルを参照するために使用できるユーザー指定の名前があります。

組み込み Web サーバーを保護するために使用される場合、keystore は通常、次の例に示すように、証明書と秘密キーを含む Java KeyStore で構成されます。

  • プロパティ

  • YAML

spring.ssl.bundle.jks.mybundle.key.alias=application
spring.ssl.bundle.jks.mybundle.keystore.location=classpath:application.p12
spring.ssl.bundle.jks.mybundle.keystore.password=secret
spring.ssl.bundle.jks.mybundle.keystore.type=PKCS12
spring:
  ssl:
    bundle:
      jks:
        mybundle:
          key:
            alias: "application"
          keystore:
            location: "classpath:application.p12"
            password: "secret"
            type: "PKCS12"

クライアント側の接続を保護するために使用される場合、truststore は通常、次の例に示すようにサーバー証明書を含む Java KeyStore で構成されます。

  • プロパティ

  • YAML

spring.ssl.bundle.jks.mybundle.truststore.location=classpath:server.p12
spring.ssl.bundle.jks.mybundle.truststore.password=secret
spring:
  ssl:
    bundle:
      jks:
        mybundle:
          truststore:
            location: "classpath:server.p12"
            password: "secret"

サポートされているプロパティの完全なセットについては、JksSslBundleProperties (Javadoc) を参照してください。

PEM エンコードされた証明書を使用した SSL の構成

プレフィックス spring.ssl.bundle.pem が付いた構成プロパティを使用して、PEM エンコードされたテキストの形式で信頼マテリアルのバンドルを構成できます。各バンドルには、バンドルを参照するために使用できるユーザー指定の名前があります。

組み込み Web サーバーを保護するために使用される場合、keystore は通常、次の例に示すように証明書と秘密キーを使用して構成されます。

  • プロパティ

  • YAML

spring.ssl.bundle.pem.mybundle.keystore.certificate=classpath:application.crt
spring.ssl.bundle.pem.mybundle.keystore.private-key=classpath:application.key
spring:
  ssl:
    bundle:
      pem:
        mybundle:
          keystore:
            certificate: "classpath:application.crt"
            private-key: "classpath:application.key"

クライアント側の接続を保護するために使用される場合、truststore は通常、次の例に示すようにサーバー証明書を使用して構成されます。

  • プロパティ

  • YAML

spring.ssl.bundle.pem.mybundle.truststore.certificate=classpath:server.crt
spring:
  ssl:
    bundle:
      pem:
        mybundle:
          truststore:
            certificate: "classpath:server.crt"

PEM コンテンツは、certificate プロパティと private-key プロパティの両方に直接使用できます。プロパティ値に BEGIN および END マーカーが含まれている場合、リソースの場所ではなく PEM コンテンツとして扱われます。

次の例は、トラストストア証明書を定義する方法を示しています。

  • プロパティ

  • YAML

spring.ssl.bundle.pem.mybundle.truststore.certificate=-----BEGIN CERTIFICATE-----
MIID1zCCAr+gAwIBAgIUNM5QQv8IzVQsgSmmdPQNaqyzWs4wDQYJKoZIhvcNAQEL
BQAwezELMAkGA1UEBhMCWFgxEjAQBgNVBAgMCVN0YXRlTmFtZTERMA8GA1UEBwwI
...
V0IJjcmYjEZbTvpjFKznvaFiOUv+8L7jHQ1/Yf+9c3C8gSjdUfv88m17pqYXd+Ds
HEmfmNNjht130UyjNCITmLVXyy5p35vWmdf95U3uEbJSnNVtXH8qRmN9oK9mUpDb
ngX6JBJI7fw7tXoqWSLHNiBODM88fUlQSho8
-----END CERTIFICATE-----
spring:
  ssl:
    bundle:
      pem:
        mybundle:
          truststore:
            certificate: |
              -----BEGIN CERTIFICATE-----
              MIID1zCCAr+gAwIBAgIUNM5QQv8IzVQsgSmmdPQNaqyzWs4wDQYJKoZIhvcNAQEL
              BQAwezELMAkGA1UEBhMCWFgxEjAQBgNVBAgMCVN0YXRlTmFtZTERMA8GA1UEBwwI
              ...
              V0IJjcmYjEZbTvpjFKznvaFiOUv+8L7jHQ1/Yf+9c3C8gSjdUfv88m17pqYXd+Ds
              HEmfmNNjht130UyjNCITmLVXyy5p35vWmdf95U3uEbJSnNVtXH8qRmN9oK9mUpDb
              ngX6JBJI7fw7tXoqWSLHNiBODM88fUlQSho8
              -----END CERTIFICATE-----

サポートされているプロパティの完全なセットについては、PemSslBundleProperties (Javadoc) を参照してください。

SSL バンドルの適用

プロパティを使用して構成すると、Spring Boot によって自動構成されるさまざまな種類の接続の構成プロパティで SSL バンドルを名前で参照できるようになります。詳細については、組み込み Web サーバーデータテクノロジ、および REST クライアントに関するセクションを参照してください。

SSL バンドルの使用

Spring Boot は、spring.ssl.bundle プロパティを使用して構成された各名前付きバンドルへのアクセスを提供する、型 SslBundles の Bean を自動構成します。

SslBundle は、自動構成された SslBundles Bean から取得でき、クライアントライブラリで SSL 接続を構成するために使用されるオブジェクトの作成に使用できます。SslBundle は、次の SSL オブジェクトを取得するための階層化されたアプローチを提供します。

  • getStores() は、キーストアとトラストストアの java.security.KeyStore インスタンスへのアクセスと、必要なキーストアのパスワードを提供します。

  • getManagers() は、java.net.ssl.KeyManagerFactory インスタンスと java.net.ssl.TrustManagerFactory インスタンス、およびそれらが作成する java.net.ssl.KeyManager 配列と java.net.ssl.TrustManager 配列へのアクセスを提供します。

  • createSslContext() は、新しい java.net.ssl.SSLContext インスタンスを取得する便利な方法を提供します。

さらに、SslBundle は、使用されているキー、使用するプロトコル、SSL エンジンに適用する必要があるオプションに関する詳細を提供します。

次の例は、SslBundle を取得し、それを使用して SSLContext を作成する方法を示しています。

  • Java

  • Kotlin

import javax.net.ssl.SSLContext;

import org.springframework.boot.ssl.SslBundle;
import org.springframework.boot.ssl.SslBundles;
import org.springframework.stereotype.Component;

@Component
public class MyComponent {

	public MyComponent(SslBundles sslBundles) {
		SslBundle sslBundle = sslBundles.getBundle("mybundle");
		SSLContext sslContext = sslBundle.createSslContext();
		// do something with the created sslContext
	}

}
import org.springframework.boot.ssl.SslBundles
import org.springframework.stereotype.Component

@Component
class MyComponent(sslBundles: SslBundles) {

    init {
        val sslBundle = sslBundles.getBundle("mybundle")
        val sslContext = sslBundle.createSslContext()
        // do something with the created sslContext
    }

}

SSL バンドルのリロード

SSL バンドルは、キーマテリアルが変更されたときに再ロードできます。バンドルを使用するコンポーネントは、リロード可能な SSL バンドルと互換性がある必要があります。現在、次のコンポーネントと互換性があります。

  • Tomcat Web サーバー

  • Netty Web サーバー

リロードを有効にするには、次の例に示すように、構成プロパティを介してオプトインする必要があります。

  • プロパティ

  • YAML

spring.ssl.bundle.pem.mybundle.reload-on-update=true
spring.ssl.bundle.pem.mybundle.keystore.certificate=file:/some/directory/application.crt
spring.ssl.bundle.pem.mybundle.keystore.private-key=file:/some/directory/application.key
spring:
  ssl:
    bundle:
      pem:
        mybundle:
          reload-on-update: true
          keystore:
            certificate: "file:/some/directory/application.crt"
            private-key: "file:/some/directory/application.key"

ファイルウォッチャーがファイルを監視し、ファイルが変更されると、SSL バンドルがリロードされます。これにより、消費側コンポーネントでのリロードがトリガーされます。Tomcat は、SSL 対応コネクター内の証明書をローテーションします。

spring.ssl.bundle.watch.file.quiet-period プロパティを使用して、ファイルウォッチャーの静止期間 (変更が存在しないことを確認するため) を構成できます。