Springboot实现TLS双向认证的方法

 更新时间:2025年02月08日 14:35:31   作者:圆圆同学  
本文介绍了使用keytool生成和管理自签名CA证书、服务器证书和客户端证书的方法,适合Java生态系统,通过配置信任库和服务器/客户端配置,实现了Spring Boot中的TLS双向认证,感兴趣的朋友一起看看吧

keytool 是 Java 自带的工具,适合与 JKS 密钥库和信任库一起使用。

一、生成自签名CA证书

生成CA密钥对和自签名证书

keytool -genkeypair -alias my-ca -keyalg RSA -keysize 2048 -validity 3650 -keystore ca.jks -storepass changeit -keypass changeit -dname "CN=My CA, OU=My Organization, O=My Company, L=My City, ST=My State, C=US" -ext bc:c

  • -alias my-ca:CA 证书的别名。
  • -keystore ca.jks:生成的密钥库文件(包含CA密钥对和证书)。
  • -storepass-keypass:密钥库和密钥的密码。
  • -dname:证书的 Distinguished Name(DN)。
  • -ext bc:c:将证书标记为 CA 证书。

导出CA证书

keytool -exportcert -alias my-ca -keystore ca.jks -storepass changeit -file ca.crt

-file ca.crt:导出的 CA 证书文件。

二、使用CA签发服务器证书

生成服务器密钥对

keytool -genkeypair -alias server -keyalg RSA -keysize 2048 -validity 365 -keystore server.jks -storepass changeit -keypass changeit -dname "CN=server.example.com, OU=My Organization, O=My Company, L=My City, ST=My State, C=US"

  • -alias server:服务器证书的别名。
  • -keystore server.jks:生成的服务器密钥库文件。

生成证书签名请求(CSR)

keytool -certreq -alias server -keystore server.jks -storepass changeit -file server.csr

  • -file server.csr:生成的 CSR 文件。

使用CA签发服务器证书

keytool -gencert -alias my-ca -infile server.csr -outfile server.crt -keystore ca.jks -storepass changeit -validity 365 -ext SAN=dns:server.example.com

  • -infile server.csr:输入的 CSR 文件。
  • -outfile server.crt:签发的服务器证书文件。
  • -ext SAN=dns:server.example.com:可选,添加 Subject Alternative Name(SAN)。

将CA证书和服务器证书导入服务器密钥库

keytool -importcert -alias my-ca -file ca.crt -keystore server.jks -storepass changeit -noprompt
keytool -importcert -alias server -file server.crt -keystore server.jks -storepass changeit

先导入 CA 证书,再导入签发的服务器证书。

三、使用CA签发客户端证书

生成客户端密钥对

keytool -genkeypair -alias client -keyalg RSA -keysize 2048 -validity 365 -keystore client.jks -storepass changeit -keypass changeit -dname "CN=client.example.com, OU=My Organization, O=My Company, L=My City, ST=My State, C=US"

  • -alias client:客户端证书的别名。
  • -keystore client.jks:生成的客户端密钥库文件。

生成证书签名请求(CSR)

keytool -certreq -alias client -keystore client.jks -storepass changeit -file client.csr
  • -file client.csr:生成的 CSR 文件。

使用CA签发客户端证书

keytool -gencert -alias my-ca -infile client.csr -outfile client.crt -keystore ca.jks -storepass changeit -validity 365
  • -infile client.csr:输入的 CSR 文件。
  • -outfile client.crt:签发的客户端证书文件。

将CA证书和客户端证书导入客户端密钥库

keytool -importcert -alias my-ca -file ca.crt -keystore client.jks -storepass changeit -noprompt
keytool -importcert -alias client -file client.crt -keystore client.jks -storepass changeit

先导入 CA 证书,再导入签发的客户端证书。

四、配置信任库

创建信任库并导入CA证书

keytool -importcert -alias my-ca -file ca.crt -keystore truststore.jks -storepass changeit -noprompt
  • -keystore truststore.jks:生成的信任库文件。

五、配置服务器和客户端

1. 服务器配置

在 Spring Boot 中配置:

server:
  ssl:
    key-store: classpath:server.jks
    key-store-password: changeit
    key-alias: server
    trust-store: classpath:truststore.jks
    trust-store-password: changeit
    client-auth: need # 要求客户端提供证书

2. 客户端配置

在 Java 中配置:

SSLContext sslContext = SSLContextBuilder.create()
        .loadKeyMaterial(Paths.get("client.jks"), "changeit".toCharArray(), "changeit".toCharArray())
        .loadTrustMaterial(Paths.get("truststore.jks"), "changeit".toCharArray())
        .build();
HttpClient client = HttpClients.custom()
        .setSSLContext(sslContext)
        .build();

六、总结

  • 使用 keytool 可以完全替代 openssl,生成和管理自签名 CA 证书、服务器证书和客户端证书。
  • 只需要将 CA 证书添加到信任库(truststore.jks),即可验证所有由该 CA 签发的证书。
  • 这种方法适合 Java 生态系统,尤其是使用 JKS 密钥库和信任库的场景。

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

相关文章

  • Java获取当前时间方法总结

    Java获取当前时间方法总结

    本篇文章给大家整理了关于Java获取当前时间方法,以及相关代码分享,有需要的朋友测试参考下吧。
    2018-02-02
  • Java类加载器ClassLoader源码层面分析讲解

    Java类加载器ClassLoader源码层面分析讲解

    ClassLoader翻译过来就是类加载器,普通的java开发者其实用到的不多,但对于某些框架开发者来说却非常常见。理解ClassLoader的加载机制,也有利于我们编写出更高效的代码。ClassLoader的具体作用就是将class文件加载到jvm虚拟机中去,程序就可以正确运行了
    2022-09-09
  • Java接口继承和使用接口操作示例

    Java接口继承和使用接口操作示例

    这篇文章主要介绍了Java接口继承和使用接口操作,结合具体实例形式分析了Java接口继承与使用的相关原理、操作技巧与注意事项,需要的朋友可以参考下
    2019-09-09
  • SpringBoot的@ControllerAdvice处理全局异常详解

    SpringBoot的@ControllerAdvice处理全局异常详解

    这篇文章主要介绍了SpringBoot的@ControllerAdvice处理全局异常详解,但有时却往往会产生一些bug,这时候就破坏了返回数据的一致性,导致调用者无法解析,所以我们常常会定义一个全局的异常拦截器,需要的朋友可以参考下
    2024-01-01
  • mybatis 解决将数值0识别成空字符串的问题

    mybatis 解决将数值0识别成空字符串的问题

    这篇文章主要介绍了mybatis 解决将数值0识别成空字符串的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java之Spring Bean 作用域和生命周期

    Java之Spring Bean 作用域和生命周期

    这篇文章主要介绍了Java Bean的作用域和生命周期,Bean 的作用域是指 Bean 在 Spring 整个框架中的某种行为模式,所谓的⽣命周期指的是⼀个对象从诞⽣到销毁的整个⽣命过程,我们把这个过程就叫做⼀个对象的⽣命周期,感兴趣的同学可以参考阅读
    2023-04-04
  • Spring中的@ComponentScan注解使用详解

    Spring中的@ComponentScan注解使用详解

    这篇文章主要介绍了Spring中的@ComponentScan注解使用详解,@ComponentScan 注解的作用就是根据指定的扫描路径,把路径中符合扫描规则的类装配到 Spring 容器中,需要的朋友可以参考下
    2024-01-01
  • SpringBoot优雅的进行全局异常处理的实现步骤

    SpringBoot优雅的进行全局异常处理的实现步骤

    在软件开发的世界里,异常处理是保证系统稳定性和用户体验的关键因素之一,尤其是在构建基于微服务架构的应用时,SpringBoot提供了一套强大的工具来帮助开发者管理这些异常,所以本文给大家介绍了SpringBoot如何优雅的进行全局异常处理,需要的朋友可以参考下
    2025-02-02
  • IntelliJ IDEA Java项目手动添加依赖 jar 包的方法(图解)

    IntelliJ IDEA Java项目手动添加依赖 jar 包的方法(图解)

    这篇文章主要介绍了IntelliJ IDEA Java项目手动添加依赖 jar 包,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • SpringMVC拦截器超详细解读

    SpringMVC拦截器超详细解读

    SpringMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。 依赖于web框架,在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用
    2022-07-07

最新评论