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…

基于深度学习的社交网络中的社区检测

在社交网络分析中&#xff0c;社区检测是一项核心任务&#xff0c;旨在将网络中的节点&#xff08;用户&#xff09;划分为具有高内部连接密度且相对独立的子群。基于深度学习的社区检测方法&#xff0c;通过捕获复杂的网络结构信息和节点特征&#xff0c;在传统方法基础上实现…

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

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

如何修改远程分支?修改了会影响什么?

要修改 Git 远程仓库中的分支名称&#xff0c;可以按照以下步骤操作&#xff1a; 首先&#xff0c;在本地仓库中重命名分支。使用以下命令将当前分支重命名为新名称&#xff1a; git branch -m <old-branch-name> <new-branch-name>例如&#xff0c;如果你想要将名…

12. 内存管理

一、内存的组织方式 程序员编写完程序之后&#xff0c;程序要先加载在计算机的内存中&#xff0c;再运行程序。在 C 中&#xff0c;不同数据在内存中所存储的位置也不一样。全局变量存储在内存中的静态存储区&#xff0c;非静态的局部变量存储在内存中的动态存储区&#xff08;…

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; 三、解释推送命令 添加远程仓库…

2025前端面试-性能优化(HTML与CSS)---003

1.什么是SEO 定义 &#xff1a;Serach Engine Optimization涉及到的使用&#xff1a; 门户网站或者功能网站&#xff08;搜索引擎展示的先后顺序&#xff0c;推广 如搜索pdf转化器搜索之后&#xff0c;同质化显示出来的内容先后会决定网站的点击量&#xff09; 2. SEO有哪些关…

自监督强化学习:对比预测编码(CPC)算法深度解析

自监督强化学习&#xff1a;对比预测编码&#xff08;CPC&#xff09;算法深度解析 引言 在人工智能领域&#xff0c;强化学习&#xff08;Reinforcement Learning, RL&#xff09;与自监督学习&#xff08;Self-Supervised Learning, SSL&#xff09;的结合正在引领一场革命…

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

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

C# 中 发送HTTP请求 实现Ajax功能

Ajax技术的核心及其在jQuery中的使用&#xff0c;包括GET和POST请求的实现&#xff0c;以及Ajax轮询请求的工作原理。通过实例展示了如何使用jQuery.Ajax进行HTTP请求&#xff0c;与后端接口交互&#xff0c;以及处理JSON数据。同时还提到了跨域问题和轮询请求中停止条件的设定…

使用socket库创建简单的客户端和服务器

以下是使用Python的socket库创建简单的客户端和服务器的示例。这个示例将展示如何建立一个基本的TCP连接&#xff0c;服务器接收数据并发送响应&#xff0c;客户端发送数据并接收响应。 服务器端代码 首先&#xff0c;我们编写服务器端代码&#xff0c;它将监听来自客户端的连…

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

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

写一个小日历

以下是一个示例&#xff0c;展示了如何创建一个基本的日历 日历 1. HTML 结构 首先&#xff0c;创建一个基本的 HTML 结构&#xff0c;用于展示日历。 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta na…

springboot项目中引入配置文件数据的方式

yml中引用变量 1. 直接在当前文件中定义然后使用格式 ${} 引用 2. 如果使用\t 转义不成功可以添加双引号 读取yml单个属性数据 使用Value注解获取单个属性值&#xff0c;格式${一级属性名.二级属性名} Value("${country}") private String country; Value(&…

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…

Android 同花顺面经

Android 同花顺面经 文章目录 Android 同花顺面经一面 一面 Android组件化搭建使用接口层路由有什么缺点&#xff1f; 如果更改接口的话&#xff0c;其他的依赖的moudle都得改 说说kotlin和java的区别&#xff1f; Java是支持面向对象的编程&#xff0c;Kotlin是支持面向对象支…

Flutter报错信息Unhandled Exception: Binding has not yet been initialized.

错误信息如下&#xff1a; Typically, this is done by calling "WidgetsFlutterBinding.ensureInitialized()" or "runApp()" (the latter calls the former). Typically this call is done in the "void main()" method. The "ensureIni…

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

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