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.mzph.cn/news/884257.shtml

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

相关文章

九识智能与徐工汽车达成战略合作,共绘商用车未来新蓝图

近日&#xff0c;九识智能与徐工汽车签署战略合作协议&#xff0c;标志着双方在智能驾驶技术与新能源商用车融合应用、联合生产及市场推广等方面迈入深度合作的新篇章&#xff0c;将共同引领智能驾驶技术商业化浪潮。 近年来&#xff0c;在国家智能化发展战略的引领下&#xff…

根据Redis漏洞通知的整改修复过程

一、收到通知&#xff1a; 二、查看本校“宝山商城&#xff08;教学&#xff09;”已安装的Redis版本号 对照影响范围的版本号&#xff0c;在其内&#xff0c;所以需要升级Redis版本。 三、升级centos中的Redis版本 在Cent0S系统中&#xff0c;如果我们需要升级Redis版本&…

docker 可用镜像服务地址(2024.10.31亲测可用)

1.错误 Error response from daemon: Get “https://registry-1.docker.io/v2/” 原因&#xff1a;镜像服务器地址不可用。 2.可用地址 编辑daemon.json&#xff1a; vi /etc/docker/daemon.json内容修改如下&#xff1a; {"registry-mirrors": ["https://…

Git (推送到远端仓库)

目录 一、在 gitee 上创建一个仓库 二、将项目推送到远程仓库 三、解释推送命令 一、在 gitee 上创建一个仓库 操作如下&#xff1a; 二、将项目推送到远程仓库 这里例举新的项目推送到远程仓库的例子&#xff1a; 打开仓库查看&#xff1a; 三、解释推送命令 添加远程仓库…

opencv学习笔记(6):图像预处理(直方图、图像去噪)

3.直方图 直方图是用来表现图像中亮度分布的&#xff0c;给出的是图像中某个亮度或者某个范围亮度下共有几个像素&#xff0c;即统计一幅图某个亮度像素的数量。 直方图不能反映某一灰度值像素在图像中的位置&#xff0c;失去了图像的空间信息。图像直方图由于其计算代价较小&a…

《双指针篇》---移动零

题目传送门 这道题可以归类为 数组划分/数组分块 。 题目制定了一个规则&#xff0c;我们可以在这个规则下&#xff0c;将数组划分为若干个区间。 这道题让我们把所有非零元素移动到左边。所有零元素移动到右边。 将数组划分为&#xff1a; 左区间非0&#xff1b; 右区间&…

OpenHarmony、HarmonyOS、HarmonyNext互相兼容吗?

1&#xff0c;三者之间的关系 OpenHarmony&#xff1a;开源底层。HarmonyOS&#xff1a;闭源手机系统&#xff0c;兼容安卓生态。HarmonyOS NEXT&#xff1a;纯血鸿蒙&#xff0c;不兼容安卓。 上一篇文章简单介绍过&#xff0c;就不再多说了&#xff0c;这里说一下HarmonyOS …

Camera学习笔记(202410)

课程&#xff1a;CameraX&#xff1a;面向开发者的摄像头支持库 链接&#xff1a;CameraX&#xff1a;面向开发者的摄像头支持库_哔哩哔哩_bilibili 课程时长&#xff1a;28:00 学习时间&#xff1a;2024-10-29 概述&#xff1a;2019年Android CameraX的发布会 个人感觉&a…

Django入门教程——用户管理实现

第六章 用户管理实现 教学目的 复习数据的增删改查的实现。了解数据MD5加密算法以及实现模型表单中&#xff0c;自定义控件的使用中间件的原理和使用 需求分析 系统问题 员工档案涉及到员工的秘密&#xff0c;不能让任何人都可以看到&#xff0c;主要是人事部门进行数据的…

BugKu练习记录:矛盾

题目&#xff1a; $num$_GET[num]; if(!is_numeric($num)) { echo $num; if($num1) echo flag{**********}; }关键在于绕过is_numeric&#xff0c;PHP中字符串与数字弱比较&#xff0c;会将字符串转换为数字&#xff0c;截至到非数字字符&#xff0c;如果第一个字符就是非数字…

安宝特分享 | AR技术引领:跨国工业远程协作创新模式

在当今高度互联的工业环境中&#xff0c;跨国合作与沟通变得日益重要。然而&#xff0c;语言障碍常常成为高效协作的绊脚石。安宝特AR眼镜凭借其强大的多语言自动翻译和播报功能&#xff0c;正在改变这一局面&#xff0c;让远程协作变得更加顺畅。 01 多语言翻译优势 安宝特A…

逗号运算符应用举例

在main.cpp里输入程序如下&#xff1a; #include <iostream> //使能cin(),cout(); #include <iomanip> //使能setbase(),setfill(),setw(),setprecision(),setiosflags()和resetiosflags(); //setbase( char x )是设置输出数字的基数,如输出进制数则用set…

vxe-table v4.8+ 与 v3.10+ 虚拟滚动支持动态行高,虚拟渲染更快了

Vxe UI vue vxe-table v4.8 与 v3.10 解决了老版本虚拟滚动不支持动态行高的问题&#xff0c;重构了虚拟渲染&#xff0c;渲染性能大幅提升了&#xff0c;行高自适应和列宽拖动都支持&#xff0c;大幅降低虚拟渲染过程中的滚动白屏&#xff0c;大量数据列表滚动更加流畅。 自适…

ICPC区域赛成都站【赛后回顾+总结】

传送门 前言赛后总结赛后回顾赛后感悟 前言 首先&#xff0c;这是本人本赛季第一场XCPC区域赛&#xff0c;也是本人算竞生涯中第一场XCPC区域赛&#xff08;之前只打过邀请赛和省赛&#xff09;。 赛后总结 然后赛后总结一下&#xff1a;我队天崩开局&#xff0c;我队出师不利…

c盘满了怎么清理垃圾而不误删?6招轻松清理C盘,快来试试

c盘满了怎么清理垃圾而不误删&#xff1f;相信平时工作生活中离不开电脑&#xff0c;随着使用电脑时间就了&#xff0c;C 盘的空间会不断被占据&#xff0c;进而致使系统运行变得迟缓&#xff0c;甚至出现卡顿现象。因此&#xff0c;定期清理 C 盘的是非常重要的。很多电脑小白…

excel的宏1

1宏和vba visual basic for applications 一种编程语言 2vba编写一系列指令的程序&#xff0c;就是宏 3完成重复性的数据任务 点击开发工具 使用设置的宏之后表格的变化 excel帮忙编写了一个代码 以上为自动编写的代码

Swarm-LIO: Decentralized Swarm LiDAR-inertial Odometry论文翻译

文章目录 前言一、介绍二、相关工作三、方法A. 问题表述B. 框架概述C. 群体系统的初始化D. 去中心化激光雷达-惯性状态估计 四. 实验A. 室内飞行B. 退化环境飞行C. 去中心化部署 五. 结论和未来工作 前言 原文&#xff1a;原文 准确的自我状态和相对状态估计是完成群体任务的关…

光耦合器的关键作用和创新---腾恩科技

光耦合器或光隔离器已成为电路中必不可少的器件&#xff0c;它允许信号在无需直接电接触的情况下跨不同电压域传输。这种隔离能力对于保护低压元件免受高压电路的潜在损坏至关重要。本文将仔细研究光耦合器在当今技术中发挥的独特作用&#xff0c;并探讨其在各种应用中不断扩展…

linux:回车换行+进度条+git理解与使用以及如何解决免密码push问题

目录 特殊符号 Linux小程序---进度条 1.\n和\r的理解 2.缓冲区 3.设计简单的倒计时 4.设计简单的进度条 git-版本控制器 1.理解什么是版本控制器? 2.git的使用 3.git的其他说明 总结上传过程 特殊符号 1.(取消显化) 的作用:执行指令,但指令本身不会显化; 举个例子:我…

vscode摸鱼学习插件开发

不知道大家在摸鱼的时候&#xff0c;会不会想要学习&#xff1f; 或者有没有考公人&#xff0c;下班要学习的&#xff1f; 上班时间摸鱼&#xff0c;下班时间不够学习&#xff1f; 为此&#xff0c;我决定开发一个vscode插件&#xff0c;来刷粉笔题 粉笔插件名称&#xff1a;…