SpringBoot实现国密通信

SpringBoot实现国密通信

      • 1. 生成支持国密的证书
        • 1.1 安装 GMSSL(如果未安装)
        • 1.2 生成 SM2 密钥对和证书
      • 2. 配置 Spring Boot 项目使用 HTTPS
        • 2.1 项目 B:提供 HTTPS 接口
        • 2.2 项目 A:使用 HTTPS 调用项目 B
      • 3. 启动和测试
      • 备注
      • 如何验证国密生效
        • 1. 检查证书算法信息
        • 2. 使用抓包工具分析加密算法
        • 3. 查看项目启动日志
        • 4. 服务器端代码调试验证

要在两个 Spring Boot 项目(项目 A 和项目 B)之间通过国密协议实现 HTTPS 通信,我们需要完成以下步骤:

  1. 生成支持国密的证书
  2. 配置两个 Spring Boot 项目,使用国密证书实现 HTTPS
  3. 项目 A 使用 RestTemplate 调用项目 B 的接口,验证通信是否成功。

1. 生成支持国密的证书

为了使用国密算法,通常需要使用一些支持国密算法的工具来生成证书。可以使用 OpenSSL 结合 gmssl 工具,或直接使用专门的工具,例如一些企业提供的国密证书生成工具。这里假设我们使用 GMSSL 工具生成证书。

1.1 安装 GMSSL(如果未安装)

可以从 GMSSL 的官方 GitHub 仓库下载并编译安装。

1.2 生成 SM2 密钥对和证书
  1. 生成 CA 证书(用于签发服务器和客户端证书):

    gmssl ecparam -genkey -name sm2p256v1 -out ca-key.pem
    gmssl req -new -x509 -sm3 -key ca-key.pem -out ca-cert.pem -subj "/CN=GM CA"
    
  2. 生成服务器证书(假设用于项目 B):

    gmssl ecparam -genkey -name sm2p256v1 -out server-key.pem
    gmssl req -new -key server-key.pem -out server-req.pem -subj "/CN=localhost"
    gmssl x509 -req -in server-req.pem -sm3 -CA ca-cert.pem -CAkey ca-key.pem -out server-cert.pem -days 365 -CAcreateserial
    
  3. 生成客户端证书(假设用于项目 A):

    gmssl ecparam -genkey -name sm2p256v1 -out client-key.pem
    gmssl req -new -key client-key.pem -out client-req.pem -subj "/CN=localhost"
    gmssl x509 -req -in client-req.pem -sm3 -CA ca-cert.pem -CAkey ca-key.pem -out client-cert.pem -days 365 -CAcreateserial
    
  4. 将证书和密钥导出为 PKCS12 格式(供 Spring Boot 项目使用):

    • 服务器端(项目 B):

      gmssl pkcs12 -export -in server-cert.pem -inkey server-key.pem -out server-keystore.p12 -name server -CAfile ca-cert.pem -caname root
      
    • 客户端(项目 A):

      gmssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -out client-keystore.p12 -name client -CAfile ca-cert.pem -caname root
      

2. 配置 Spring Boot 项目使用 HTTPS

2.1 项目 B:提供 HTTPS 接口
  1. server-keystore.p12 放置在项目 B 的 resources 目录下。

  2. 在项目 B 的 application.yml 配置文件中,配置 HTTPS 连接:

    server:port: 8443ssl:# server-keystore.p12文件放在工程src/main/resource目录下key-store: classpath:server-keystore.p12key-store-password: changeit # 使用导出时设置的密码key-store-type: PKCS12key-alias: server
    
  3. 创建一个简单的 HTTPS 端点,供项目 A 调用:

    @RestController
    public class HelloController {@GetMapping("/hello")public String sayHello() {return "Hello from Project B with GMSSL!";}
    }
    
2.2 项目 A:使用 HTTPS 调用项目 B
  1. client-keystore.p12 放置在项目 A 的 resources 目录下。

  2. 在项目 A 的 application.yml 中配置 SSL 证书,以便项目 A 可以信任项目 B 的服务器证书:

    server:ssl:# client-keystore.p12文件放在工程src/main/resource目录下key-store: classpath:client-keystore.p12key-store-password: changeitkey-store-type: PKCS12key-alias: client
    
  3. 配置 RestTemplate,加载客户端证书并信任项目 B 的证书:

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;
    import javax.net.ssl.SSLContext;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.ssl.SSLContextBuilder;
    import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
    import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;@Configuration
    public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate() throws Exception {SSLContext sslContext = SSLContextBuilder.create().loadKeyMaterial(new File("src/main/resources/client-keystore.p12"), // 客户端证书路径"changeit".toCharArray(), // KeyStore 密码"changeit".toCharArray()) // Key 密码// 如果使用的是第三方权威 CA 签发的标准证书(如 DigiCert、GlobalSign、Let's Encrypt 等),通常不需要在客户端手动配置 CA 证书。因为这些权威 CA 的根证书已经被包含在大多数 JDK 的默认信任库中。省略下面一行.loadTrustMaterial(new File("src/main/resources/ca-cert.pem"), new TrustSelfSignedStrategy()).build();HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(HttpClients.custom().setSSLContext(sslContext).build());return new RestTemplate(requestFactory);}
    }
    
  4. 在项目 A 中调用项目 B 的 HTTPS 接口:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;@RestController
    public class TestController {@Autowiredprivate RestTemplate restTemplate;@GetMapping("/call-hello")public String callHello() {String url = "https://localhost:8443/hello"; // 项目 B 的 HTTPS 地址return restTemplate.getForObject(url, String.class);}
    }
    

3. 启动和测试

  1. 启动项目 B,然后启动项目 A。
  2. 访问项目 A 的接口 http://localhost:8080/call-hello,它会通过 HTTPS 连接到项目 B。
  3. 如果配置正确,将看到返回消息:Hello from Project B with GMSSL!

备注

  • 本示例使用的是自签名证书。在实际生产环境中,建议使用权威 CA 签发的国密证书。
  • 若有客户端与服务器证书双向认证的需求,还需要在服务器端配置 client-auth=need

如何验证国密生效

要验证 A 和 B 项目之间是否采用了国密算法通信,可以通过以下几种方法来确认:

1. 检查证书算法信息

可以查看项目 B 的服务器证书,确保它确实是基于国密算法生成的(如 SM2 算法)。在 B 项目的 keystore 中找到证书,使用以下命令查看证书的算法:

keytool -list -v -keystore server-keystore.p12 -storepass <password>

在输出中找到 Signature algorithm 字段,确保它是国密算法(例如 SM2WITHSM3)签名的。如果服务器证书使用的是 SM2,则通信时双方会使用国密的公私钥来加解密数据。

2. 使用抓包工具分析加密算法

使用 Wireshark 等抓包工具可以详细检查 A 和 B 之间的 HTTPS 流量。抓包时,注意观察 TLS 握手包中的加密算法和密钥交换算法,确认是否包含 SM2、SM3、SM4 等国密算法。

具体步骤:

  1. 打开 Wireshark 并开始抓包。
  2. 过滤流量为 HTTPS 或指定 B 项目的 IP 地址。
  3. 找到 TLS 握手包,查看加密算法的协商信息,确保包含国密协议(例如 ECDHE-SM2-WITH-SM4-SM3 或其他 SM 系列)。
3. 查看项目启动日志

有些 SSL/TLS 库会在握手时输出所使用的加密算法,检查 A 和 B 项目的启动日志或请求日志,有时可以找到所使用的具体加密算法信息。如果配置正确,日志中可能会记录握手使用的国密算法。

4. 服务器端代码调试验证

在项目 B 中可以使用调试代码来确认使用的密钥对。例如,使用 SSLContext 打印出当前会话的加密算法,确保其采用 SM 系列算法:

import javax.net.ssl.SSLSession;
import javax.net.ssl.HttpsURLConnection;
import java.net.URL;public void checkSSLConnection() throws Exception {URL url = new URL("https://localhost:8443/hello");HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();connection.connect();SSLSession session = connection.getSession();System.out.println("Cipher Suite: " + session.getCipherSuite()); // 确认是否为 SM 算法
}

通过这些方法,可以更好地验证 A 和 B 项目是否确实采用了国密算法进行通信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/461623.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud Sleuth(Micrometer Tracing +Zipkin)

分布式链路追踪 分布式链路追踪技术要解决的问题&#xff0c;分布式链路追踪&#xff08;Distributed Tracing&#xff09;&#xff0c;就是将一次分布式请求还原成调用链路&#xff0c;进行日志记录&#xff0c;性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节…

Vision - 开源视觉分割算法框架 Grounded SAM2 配置与推理 教程 (1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/143388189 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Ground…

百度如何打造AI原生研发新范式?

&#x1f449;点击即可下载《百度AI原生研发新范式实践》资料 2024年10月23-25日&#xff0c;2024 NJSD技术盛典暨第十届NJSD软件开发者大会、第八届IAS互联网架构大会在南京召开。本届大会邀请了工业界和学术界的专家&#xff0c;优秀的工程师和产品经理&#xff0c;以及其它行…

初认识构建工具

初认识构建工具Webpack & Vite 目录 前言webpack 使用步骤配置文件 _entry_output✨_loader_babel_plugin_source map 开发服务器 前言 不同于node中编写代码&#xff0c;在html、css、js中不能放心使用模块化规范&#xff0c;主要是浏览器兼容性问题&#xff0c;以及…

数据结构 ——— 向上调整建堆和向下调整建堆的区别

目录 前言 向下调整算法&#xff08;默认小堆&#xff09; 利用向下调整算法对数组建堆 向上调整建堆和向下调整建堆的区别​编辑 向下调整建堆的时间复杂度&#xff1a; 向上调整建堆的时间复杂度&#xff1a; 结论 前言 在上一章讲解到了利用向上调整算法对数组进行…

分享几款开源好用的图片在线编辑,适合做快速应用嵌入

图片生成器是指一种工具或软件&#xff0c;用于自动生成图片或图像内容&#xff0c;通常依据用户设定的参数或模板进行操作。这种工具能够帮助用户快速创建视觉效果丰富的图像&#xff0c;而无需具备专业的设计技能。 在数字化时代&#xff0c;图片编辑已经成为日常工作和生活的…

我为何要用wordpress搭建一个自己的独立博客

我在csdn有一个博客&#xff0c;这个博客是之前学习编程时建立的。 博客有哪些好处呢&#xff1f; 1&#xff0c;可以写自己的遇到的问题和如何解决的步骤 2&#xff0c;心得体会&#xff0c;经验&#xff0c;和踩坑 3&#xff0c;可以转载别人的好的技术知识 4&#xff0c;宝贵…

ts:使用fs内置模块简单读写文件

ts&#xff1a;使用fs内置模块简单读写文件 一、主要内容说明二、例子&#xff08;一&#xff09;、fs模块的文件读写1.源码1 &#xff08;fs模块的文件读写&#xff09;2.源码1运行效果 三、结语四、定位日期 一、主要内容说明 在ts中&#xff0c;我们可以使用内置的fs模块来…

十个常见的软件测试面试题,拿走不谢

所有面试问题一般建议先总后分的方式来回答&#xff0c;这样可以让面试官感觉逻辑性很强。 1. 自我介绍 之所以让我们自我介绍&#xff0c;其实是面试官想找一些时间来看简历&#xff0c;所以自我介绍不用太长的时间&#xff0c;1-2分 钟即可。 自我介绍一般按以下方式进行介…

C++中关于 <functional> 的使用

#include <functional> 是 C 标准库中的一个头文件&#xff0c;主要用于提供与函数对象、函数指针和函数适配器相关的功能 一&#xff1a;定义方式 1. 定义和使用 std::function 和 Lambda 表达式 2&#xff1a;使用 std::bind 你可以使用 std::bind 来绑定函数参数&am…

Axios 请求超时设置无效的问题及解决方案

文章目录 Axios 请求超时设置无效的问题及解决方案1. 引言2. 理解 Axios 的超时机制2.1 Axios 超时的工作原理2.2 超时错误的处理 3. Axios 请求超时设置无效的常见原因3.1 配置错误或遗漏3.2 超时发生在建立连接之前3.3 使用了不支持的传输协议3.4 代理服务器或中间件干扰3.5 …

WPF+MVVM案例实战(十五)- 实现一个下拉式菜单(上)

文章目录 1 案例效果2、图标资源下载3、功能实现1.文件创建2、菜单原理分析3、一级菜单两种样式实现1、一级菜单无子项样式实现2、一级菜单有子项样式实现 4、总结 1 案例效果 提示 2、图标资源下载 从阿里矢量素材官网下载需要的菜单图片&#xff0c;如下所示&#xff1a; …

【环境搭建】Apache ZooKeeper 3.8.4 Stable

软件环境 Ubuntu 20.04 、OpenJDK 11 OpenJDK 11&#xff08;如果已经安装&#xff0c;可以跳过这一步&#xff09; 安装OpenJDK 11&#xff1a; $ sudo apt-get update$ sudo apt-get install -y openjdk-11-jdk 设置 JAVA_HOME 环境变量&#xff1a; $ sudo gedit ~/.bash…

后台管理系统的通用权限解决方案(九)SpringBoot整合jjwt实现登录认证鉴权

1&#xff09;创建maven工程jjwt-login-demo&#xff0c;并配置其pom.xml文件如下 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-ins…

国考报名照片无法使用照片审核工具上传失败的解决办法

国考报名过程中&#xff0c;照片审核是至关重要的一步&#xff0c;但许多考生在上传照片时遇到了难题&#xff0c;导致无法继续报名&#xff0c;从而影响抢考场位置&#xff0c;下面就介绍如何快速完成照片处理、审核和上传过审的技巧。 一、国考报名照片基本要求首先&#xff…

vue中如何为不同功能设置不同的默认打印设置(设置不同的打印机)

浏览器自带的window.print 功能较简单&#xff0c;这里使用LODOP露肚皮打印 以下是vue2示例&#xff1a; 从官网中下载Lodop和C-Lodop官网主站安装包并安装到本地电脑可以全局搜索电脑找到安装文件LodopFuncs.js&#xff0c;也可以直接复制我贴出来的文件 //用双端口加载主JS…

数据库管理系统的ACID都各自是什么?

本文基于DBMS中ACID属性的概念&#xff0c;这些属性保证了数据库中执行事务时保持数据一致性、完整性和可靠性所。事务是访问并可能修改数据库内容的单一逻辑工作单元。交易使用读写操作访问数据。为了保持数据库的一致性&#xff0c;在事务前后&#xff0c;遵循某些属性。这些…

ssm基于vue搭建的新闻网站+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 [2 系统…

OB_GINS_day3

这里写目录标题 实现当前状态初始化实现预积分的初始化由于此时preintegration_options 是3&#xff08;也就是考虑odo以及earth rotation&#xff09;为预积分的容器添加需要积分的IMU积分因子接下来是添加新的IMU到preintegration中 实现当前状态初始化 这个state_curr的主要…

如何优化kafka和mysql处理百万级消息计算和落库

一.业务场景 最近业务需要&#xff0c;做了性能优化操作。百万级消息在kafka中秒级传输。cpu密集计算分钟级完成&#xff0c;然后在mysql中秒级落库.模型cpu计算提高了1倍&#xff0c;落表速度提高了5倍&#xff0c;2分钟内完成. 如下序列图&#xff1a; 业务系统A发送千级别…