SSL
Spring Boot 提供了配置 SSL 信任材料的能力,这些材料可以应用于多种类型的连接,以支持安全通信。可以使用前缀为 spring.ssl.bundle
的配置属性来指定命名的一组信任材料和相关信息。
使用 Java 密钥库文件配置 SSL
可以使用前缀为 spring.ssl.bundle.jks
的配置属性来配置使用 Java keytool
实用程序创建并在 JKS 或 PKCS12 格式的 Java 密钥库文件中存储的信任材料捆绑包。每个捆绑包都有一个用户提供的名称,可用于引用该捆绑包。
当用于保护嵌入式 Web 服务器时,keystore
通常配置为包含证书和私钥的 Java 密钥库,如本例所示
-
属性
-
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 密钥库,如本例所示
-
属性
-
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
可以使用前缀为 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 内容可直接用于 以下示例显示如何定义信任库证书
|
有关所有受支持属性的完整列表,请参阅 PemSslBundleProperties
。
如果使用环境变量配置捆绑包,则捆绑包的名称将 始终转换为小写。 |
应用 SSL 捆绑包
配置完成后,可以使用属性在各种连接类型的配置属性中引用 SSL 捆绑包,这些连接类型由 Spring Boot 自动配置。有关更多信息,请参阅有关 嵌入式 Web 服务器、数据技术 和 REST 客户端 的部分。
使用 SSL 捆绑包
Spring Boot 自动配置一个类型为 SslBundles
的 Bean,该 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
-
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
属性配置文件监视器的静默期(以确保没有更多更改)。