SpringBoot对SSL的支持实现

 更新时间:2024年08月22日 09:49:04   作者:听海边涛声  
本文主要介绍了SpringBoot对SSL的支持实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

https://docs.spring.io/spring-boot/docs/3.2.0/reference/htmlsingle/#features.ssl

使用 Java KeyStore 文件配置 SSL

可以使用以 spring.ssl.bundle.jks 为前缀的配置属性来配置使用 Java keytool 实用程序创建的信任材料包,并将这些包存储在 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

使用 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.crt

提示certificate 和private-key属性可以直接使用 PEM 内容。如果属性值包含 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

应用 SSL 包(Applying SSL Bundles)

一旦使用属性进行配置,就可以在由 Spring Boot 自动配置的各种类型连接的配置属性中通过名称引用 SSL 包。

使用 SSL 包(Using SSL Bundles)

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

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
    }

}

重新加载 SSL 包(Reloading SSL bundles)

当密钥材料发生更改时,可以重新加载 SSL 包。使用包的组件必须与可重新加载的 SSL 包兼容。目前,以下组件与此兼容:

  • Tomcat Web 服务器
  • Netty Web 服务器

要启用重新加载,你需要通过以下示例中的配置属性进行选择:

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 属性来配置文件监视器的静默期(以确保没有更多更改)。

到此这篇关于SpringBoot对SSL的支持实现的文章就介绍到这了,更多相关SpringBoot SSL内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文搞懂Java的SPI机制(推荐)

    一文搞懂Java的SPI机制(推荐)

    Java定义了一套JDBC的接口,但并未提供具体实现类,而是在不同云厂商提供的数据库实现包。这篇文章给大家介绍Java的SPI机制,感兴趣的朋友一起看看吧
    2021-11-11
  • Java中EnumSet代替位域代码详解

    Java中EnumSet代替位域代码详解

    这篇文章主要介绍了Java中EnumSet代替位域代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • java17日期周期格式化处理方案

    java17日期周期格式化处理方案

    Java17引入了新的日期时间格式化模式B,用于表示一天中的时间段,如上午、下午、晚上等,该模式根据CLDR定义,在不同语言环境下,该模式的输出结果会有所不同,本文给大家介绍java17日期周期格式化处理方案,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • 从0到1构建springboot web应用镜像并使用容器部署的过程

    从0到1构建springboot web应用镜像并使用容器部署的过程

    这篇文章主要介绍了从0到1构建springboot web应用镜像并使用容器部署,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • springboot 多数据源的实现(最简单的整合方式)

    springboot 多数据源的实现(最简单的整合方式)

    这篇文章主要介绍了springboot 多数据源的实现(最简单的整合方式),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • java枚举类型-Enum

    java枚举类型-Enum

    本文详细介绍了 Java1.5 引入的新特性枚举中的关键字enum,运用大量的代码加以解释,相信可以帮助到正在学习该知识的小伙伴,大家可以参考一下
    2021-08-08
  • Java 获取本机IP地址的方法的两种方法

    Java 获取本机IP地址的方法的两种方法

    本文主要介绍了Java 获取本机IP地址的方法的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • Junit 5中@ParameterizedTest与@EnumSource结合使用

    Junit 5中@ParameterizedTest与@EnumSource结合使用

    今天小编就为大家分享一篇关于Junit 5中@ParameterizedTest与@EnumSource结合使用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 利用gson将map转为json示例

    利用gson将map转为json示例

    这篇文章主要介绍了利用gson将map转为json示例,需要的朋友可以参考下
    2014-05-05
  • java实现表单必填参数验证的方法

    java实现表单必填参数验证的方法

    表单校验是很多注册时必做的功能, 一般我们的处理都是很粗暴的写个if()判断, 然后抛异常. 本文将介绍通过代理的思想, 用注解优雅的处理非空判断,感兴趣的一起来了解一下
    2021-05-05

最新评论