7.14 SSL
Spring Boot 提供了配置 SSL 信任材料的能力,该材料可应用于多种类型的连接以支持安全通信。带有 spring.ssl.bundle 前缀的配置属性可用于指定信任材料和关联信息的命名集。
7.14.1. 使用 Java KeyStore 文件配置 SSL
带有spring.ssl.bundle.jks前缀的配置属性可用于配置使用 Javakeytool实用程序创建并以 JKS 或 PKCS12 格式存储在 Java KeyStore 文件中的信任材料包。每个捆绑包都有一个用户提供的名称,可用于引用该捆绑包。
当用于保护嵌入式 Web 服务器时,keystore通常配置一个包含证书和私钥的 Java KeyStore,如下例所示:
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当用于保护客户端连接时,truststore通常使用包含服务器证书的 Java KeyStore 进行配置,如下例所示:
spring.ssl.bundle.jks.mybundle.truststore.location=classpath:server.p12
spring.ssl.bundle.jks.mybundle.truststore.password=secret有关完整支持的属性集,请参阅JksSslBundleProperties 。
7.14.2. 使用 PEM 编码的证书配置 SSL
带有spring.ssl.bundle.pem前缀的配置属性可用于以 PEM 编码文本的形式配置信任材料包。每个捆绑包都有一个用户提供的名称,可用于引用该捆绑包。
当用于保护嵌入式 Web 服务器时,keystore通常会配置证书和私钥,如下例所示:
spring.ssl.bundle.pem.mybundle.keystore.certificate=classpath:application.crt
spring.ssl.bundle.pem.mybundle.keystore.private-key=classpath:application.key当用于保护客户端连接时,truststore通常使用服务器证书进行配置,如下例所示:
spring.ssl.bundle.pem.mybundle.truststore.certificate=classpath:server.crtPEM 内容可直接用于certificate和private-key属性。如果属性值包含BEGIN和END标记,那么它们将被视为 PEM 内容而不是资源位置。以下示例显示如何定义信任库证书:
spring.ssl.bundle.pem.mybundle.truststore.certificate=\
-----BEGIN CERTIFICATE-----\n\
MIID1zCCAr+gAwIBAgIUNM5QQv8IzVQsgSmmdPQNaqyzWs4wDQYJKoZIhvcNAQEL\n\
BQAwezELMAkGA1UEBhMCWFgxEjAQBgNVBAgMCVN0YXRlTmFtZTERMA8GA1UEBwwI\n\
...\n\
V0IJjcmYjEZbTvpjFKznvaFiOUv+8L7jHQ1/Yf+9c3C8gSjdUfv88m17pqYXd+Ds\n\
HEmfmNNjht130UyjNCITmLVXyy5p35vWmdf95U3uEbJSnNVtXH8qRmN9oK9mUpDb\n\
ngX6JBJI7fw7tXoqWSLHNiBODM88fUlQSho8\n\
-----END CERTIFICATE-----\n有关完整支持的属性集,请参阅PemSslBundleProperties 。
7.14.3. 应用 SSL 捆绑包
使用属性进行配置后,可以在配置属性中通过名称引用 SSL 捆绑包,以用于 Spring Boot 自动配置的各种类型的连接。有关更多信息,请参阅有关嵌入式 Web 服务器、数据技术和REST 客户端的部分。
7.14.4. 使用 SSL 捆绑包
Spring Boot 自动配置一个SslBundles 类型的bean ,该 bean 提供对使用spring.ssl.bundle属性配置的每个命名包的访问。
SslBundle可以从自动配置的SslBundlesbean 中检索并用于创建用于在客户端库中配置 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:
@Component
public class MyComponent {
public MyComponent(SslBundles sslBundles) {
SslBundle sslBundle = sslBundles.getBundle("mybundle");
SSLContext sslContext = sslBundle.createSslContext();
// do something with the created sslContext
}
}7.14.5. 重新加载 SSL 捆绑包
当密钥材料发生变化时,可以重新加载 SSL 捆绑包。使用该捆绑包的组件必须与可重新加载的 SSL 捆绑包兼容。目前以下组件兼容:
Tomcat 网络服务器
Netty网络服务器
要启用重新加载,您需要通过配置属性选择加入,如本示例所示:
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然后,文件监视程序会监视文件,如果文件发生更改,SSL 捆绑包将被重新加载。这反过来会触发使用组件中的重新加载,例如 Tomcat 在启用 SSL 的连接器中轮换证书。
您可以使用spring.ssl.bundle.watch.file.quiet-period属性配置文件监视程序的安静期(以确保不再发生更改)。
最后更新于
这有帮助吗?