SSL
Spring Boot 提供了配置 SSL 信任材料的功能,此材料可以应用于多种类型的连接,以支持安全通信。前缀为 spring.ssl.bundle
的配置属性可用于指定信任材料的命名集和相关信息。
Configuring SSL With Java KeyStore Files
前缀为 spring.ssl.bundle.jks
的配置属性可用于配置使用 Java keytool
实用工具创建的信任材料包,这些材料存储在 JKS 或 PKCS12 格式的 Java 密钥库文件中。每个包都有一个用户提供的名称,可用于引用该包。
当用于保护嵌入式 Web 服务器时,通常会使用包含证书和私钥的 Java 密钥库配置一个 keystore
,如下例所示:
spring: ssl: bundle: jks: mybundle: key: alias: "application" keystore: location: "classpath:application.p12" password: "secret" type: "PKCS12"
当用于保护客户端连接时,通常会使用包含服务器证书的 Java 密钥库配置一个 truststore
,如下例所示:
spring: ssl: bundle: jks: mybundle: truststore: location: "classpath:server.p12" password: "secret"
请参阅 {code-spring-boot-autoconfigure-src}/ssl/JksSslBundleProperties.java[JksSslBundleProperties] 了解受支持属性的完整集。
Configuring SSL With PEM-encoded Certificates
前缀为 spring.ssl.bundle.pem
的配置属性可用于配置 PEM 编码文本形式的信任材料包。每个包都有一个用户提供的名称,可用于引用该包。
当用于保护嵌入式 Web 服务器时,通常会按照以下示例使用证书和私钥配置一个 keystore
:
spring: ssl: bundle: pem: mybundle: keystore: certificate: "classpath:application.crt" private-key: "classpath:application.key"
当用于保护客户端连接时,通常会按照以下示例使用服务器证书配置一个 truststore
:
spring: ssl: bundle: pem: mybundle: truststore: certificate: "classpath:server.crt"
PEM 内容可以直接用于 spring: ssl: bundle: pem: mybundle: truststore: certificate: | -----BEGIN CERTIFICATE----- MIID1zCCAr+gAwIBAgIUNM5QQv8IzVQsgSmmdPQNaqyzWs4wDQYJKoZIhvcNAQEL BQAwezELMAkGA1UEBhMCWFgxEjAQBgNVBAgMCVN0YXRlTmFtZTERMA8GA1UEBwwI ... V0IJjcmYjEZbTvpjFKznvaFiOUv+8L7jHQ1/Yf+9c3C8gSjdUfv88m17pqYXd+Ds HEmfmNNjht130UyjNCITmLVXyy5p35vWmdf95U3uEbJSnNVtXH8qRmN9oK9mUpDb ngX6JBJI7fw7tXoqWSLHNiBODM88fUlQSho8 -----END CERTIFICATE----- |
请参阅 {code-spring-boot-autoconfigure-src}/ssl/PemSslBundleProperties.java[PemSslBundleProperties] 获取受支持的全部属性。
Applying SSL Bundles
一旦使用属性进行配置,SSL 捆绑包可以在由 Spring Boot 自动配置的各种连接类型的配置属性中通过名称进行引用。有关更多信息,请参阅 embedded web servers、data technologies 和 REST clients 部分。
Using SSL Bundles
Spring Boot 自动配置一个 SslBundles
类型的 bean,可以访问通过 spring.ssl.bundle
属性配置的每个已命名捆绑包。
可以从自动配置的 SslBundles
bean 检索 SslBundle
,并将其用于创建对象,这些对象用来在客户端库中配置 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
:
Reloading SSL bundles
当密钥资料更改时,SSL 捆绑包可以重新加载。使用捆绑包的组件必须与可重新加载的 SSL 捆绑包兼容。当前与之兼容的组件如下:
-
Tomcat web server
-
Netty web server
要启用重新加载,你需要通过配置属性选择加入,如下例所示:
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 的连接器中轮换证书。
你可以使用 configprop:spring.ssl.bundle.watch.file.quiet-period[] 属性配置文件观察器的静默时间(确保不再发生任何更改)。