此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1

Spring Boot 提供了配置 SSL 信任材料的功能,这些材料可以应用于多种类型的连接,以支持安全通信。 带有前缀的配置属性可用于指定命名的信任材料集和关联信息。spring.ssl.bundle

使用 Java KeyStore 文件配置 SSL

带有前缀的配置属性可用于配置使用 Java 实用程序创建并存储在 JKS 或 PKCS12 格式的 Java KeyStore 文件中的信任材料包。 每个捆绑包都有一个用户提供的名称,可用于引用捆绑包。spring.ssl.bundle.jkskeytool

当用于保护嵌入式 Web 服务器时,通常配置包含证书和私钥的 Java 密钥库,如以下示例所示:keystore

  • Properties

  • 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"

当用于保护客户端连接时,通常使用包含服务器证书的 Java KeyStore 进行配置,如下例所示:truststore

  • Properties

  • 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

使用 PEM 编码的证书配置 SSL

带有前缀的配置属性可用于以 PEM 编码文本的形式配置信任材料包。 每个捆绑包都有一个用户提供的名称,可用于引用捆绑包。spring.ssl.bundle.pem

当用于保护嵌入式 Web 服务器时,通常使用证书和私钥进行配置,如以下示例所示:keystore

  • Properties

  • 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

  • Properties

  • YAML

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

PEM 内容可直接用于 和 属性。 如果属性值包含 和 标记,则它们将被视为 PEM 内容,而不是资源位置。certificateprivate-keyBEGINEND

以下示例演示如何定义信任库证书:

  • Properties

  • 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

PEM 内容可直接用于 和 属性。 如果属性值包含 和 标记,则它们将被视为 PEM 内容,而不是资源位置。certificateprivate-keyBEGINEND

以下示例演示如何定义信任库证书:

  • Properties

  • 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-----

应用 SSL 捆绑包

使用属性配置后,可以在 Spring Boot 自动配置的各种类型的连接的配置属性中按名称引用 SSL 捆绑包。 有关详细信息,请参阅有关嵌入式 Web 服务器数据技术和 REST 客户端的部分。

使用 SSL 捆绑包

Spring Boot 会自动配置一个 bean 类型,该 bean 提供对使用属性配置的每个命名包的访问。SslBundlesspring.ssl.bundle

可以从自动配置的 Bean 中检索 an,并用于创建用于在客户机库中配置 SSL 连接的对象。 提供了获取这些 SSL 对象的分层方法:SslBundleSslBundlesSslBundle

  • getStores()提供对密钥库和信任库实例以及任何必需的密钥库密码的访问。java.security.KeyStore

  • getManagers()提供对 AND 实例以及它们创建的 AND 数组的访问。java.net.ssl.KeyManagerFactoryjava.net.ssl.TrustManagerFactoryjava.net.ssl.KeyManagerjava.net.ssl.TrustManager

  • createSslContext()提供了获取新实例的便捷方式。java.net.ssl.SSLContext

此外,还提供了有关正在使用的密钥、要使用的协议以及应应用于 SSL 引擎的任何选项的详细信息。SslBundle

下面的示例演示如何检索并使用它来创建一个:SslBundleSSLContext

  • 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 服务器

若要启用重新加载,需要通过配置属性选择加入,如以下示例所示:

  • Properties

  • 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