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

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

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

使用 Java KeyStore 文件配置 SSL

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

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

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 进行配置,如下例所示:truststoreSpring中文文档

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"

有关受支持的完整属性集,请参阅 JksSslBundlePropertiesSpring中文文档

使用 PEM 编码的证书配置 SSL

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

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

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"

当用于保护客户端连接时,通常使用服务器证书进行配置,如以下示例所示:truststoreSpring中文文档

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

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

以下示例演示如何定义信任库证书:Spring中文文档

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

有关支持的完整属性集,请参阅 PemSslBundlePropertiesSpring中文文档

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

以下示例演示如何定义信任库证书:Spring中文文档

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 客户端的部分。Spring中文文档

使用 SSL 捆绑包

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

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

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

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

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

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

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

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 捆绑软件兼容。 目前,以下组件兼容:Spring中文文档

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

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中文文档

可以使用该属性配置文件观察程序的静默期(以确保不再有更改)。spring.ssl.bundle.watch.file.quiet-periodSpring中文文档