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双向认证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Mvc中拦截器Interceptor用法解读

    Spring Mvc中拦截器Interceptor用法解读

    这篇文章主要介绍了Spring Mvc中拦截器Interceptor用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • 详解Java中PriorityQueue的作用和源码实现

    详解Java中PriorityQueue的作用和源码实现

    这篇文章主要为大家详细介绍了Java中阻塞队列PriorityQueue的作用和源码实现的相关知识,文中的示例代码讲解详细,需要的小伙伴可以了解下
    2024-02-02
  • java变量的声明与赋值分离规范示例

    java变量的声明与赋值分离规范示例

    这篇文章主要为大家介绍了java变量的声明与赋值分离规范示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • springboot整合redis之消息队列

    springboot整合redis之消息队列

    本文主要介绍了springboot整合redis之消息队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Java国密加密SM2代码详细使用步骤

    Java国密加密SM2代码详细使用步骤

    SM2算法可以用较少的计算能力提供比RSA算法更高的安全强度,而所需的密钥长度却远比RSA算法低,下面这篇文章主要给大家介绍了关于Java国密加密SM2代码的相关资料,需要的朋友可以参考下
    2024-07-07
  • spring boot 如何指定profile启动

    spring boot 如何指定profile启动

    这篇文章主要介绍了spring boot 如何指定profile启动的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 基于Jenkins搭建.NET FrameWork持续集成环境

    基于Jenkins搭建.NET FrameWork持续集成环境

    这篇文章主要介绍了基于Jenkins搭建.NET FrameWork持续集成环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 手撸一个 spring-boot-starter的全过程

    手撸一个 spring-boot-starter的全过程

    这篇文章主要介绍了手撸一个 spring-boot-starter的全过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Spring Cloud动态配置刷新RefreshScope使用示例详解

    Spring Cloud动态配置刷新RefreshScope使用示例详解

    这篇文章主要为大家介绍了Spring Cloud动态配置刷新RefreshScope使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Java多线程中的Executor详解

    Java多线程中的Executor详解

    这篇文章主要介绍了Java多线程中的Executor详解,该接口提供了一种将任务提交与如何运行每个任务的机制(包括线程使用、调度等细节)解耦的方法,它通常使用预先创建线程而不是创建线程,需要的朋友可以参考下
    2023-12-12

最新评论