死磕GMSSL通信-java/Netty系列(二)

news2024/11/25 17:18:29
死磕GMSSL通信-java/Netty系列(二)

在上一篇文章中,我们探讨了如何利用C/C++实现国密通信。而本文将聚焦于Java环境下,特别是基于Netty框架,如何实现与国密系统的安全通信。为了确保新项目遵循最新的国密标准,我们将优先推荐使用GB/T 38636-2020(TLCP)协议。对于Java开发者而言,可以选用TencentKonaSMSuite这一基于Java原生实现的库来支持TLCP/GMSSL、TLS 1.3(含RFC 8998扩展)及TLS 1.2等多种协议,以及SM2、SM3、SM4等国密算法。然而,若项目已依赖于guanzhi/GmSSL,因其基于OpenSSL实现,与TencentKona存在兼容性问题,特别是在SM2withSM3算法的验签环节。鉴于网上对此类问题反馈较多,且难以直接解决,若您的项目与此情况相符,以下将重点介绍如何对Netty进行针对性改造,以适应国密通信需求。如果您并非处于此类特定场景,本部分内容可能并不适用。

一、GM/T与TLCP标准概览

国密通信目前遵循两大标准:GM/T 0024-2014(GMSSL)与GB/T 38636-2020(TLCP)。其中,TLCP作为更新的标准,其规范更加完善,广泛支持SM系列密码算法和数字证书等技术,以保障传输层的机密性、完整性和身份认证。两者的详细差异可参阅关于 TLCP | gotlcp (trisia.github.io)。对于新项目,建议优先采用TLCP协议以确保合规性和安全性。

二、TencentKonaSMSuite与原生Java支持

TencentKonaSMSuite是一组全面的Java安全提供商,不仅实现了SM2、SM3、SM4等国密算法,还支持TLCP、GMSSL、TLS 1.3(含RFC 8998扩展)及TLS 1.2等协议。其完全基于Java编写,具备良好的跨平台兼容性,适用于各种运行Java环境的操作系统,包括但不限于Linux、macOS、Windows,以及支持x86_64和aarch64架构的CPU。对于Android平台,由于不依赖任何内部JDK API,TencentKonaSMSuite同样能够顺利运行。

三、与guanzhi/GmSSL兼容性问题及Netty改造方案

尽管TencentKonaSMSuite提供了丰富的国密支持,但对于已使用guanzhi/GmSSL的项目,由于后者基于OpenSSL实现,两者之间可能存在兼容性问题。尤其是SM2withSM3算法的验签环节,许多用户报告遇到困难,且无有效解决方案。鉴于此,对于已深度依赖guanzhi/GmSSL的项目,选择继续沿用其国密功能并针对Netty进行相应改造,以满足现有系统的通信需求。

Netty本身支持原生OpenSSL访问,这为基于guanzhi/GmSSL的国密通信提供了便利。针对此类场景,改造Netty以实现国密通信的主要步骤如下:

  1. 配置OpenSSL环境: 确保项目环境中正确安装并配置了包含国密支持的OpenSSL库。guanzhi/GmSSL通常会提供对应的OpenSSL编译版本,需将其路径添加至系统环境变量或项目配置中,确保Netty能够找到并链接到正确的库文件。

  2. 定制Netty SSL引擎: 利用Netty提供的SslContextBuilder及其相关API,创建自定义的SSL上下文,指定使用GmSSL提供的OpenSSL引擎。这通常涉及到设置正确的协议版本、密码套件列表(如SM2-WITH-SMS4-SM3),以及指向GmSSL证书和私钥文件的路径。

  3. 适配国密握手流程: 根据GmSSL的国密握手协议特点,可能需要在Netty的SSL处理逻辑中进行特定调整。例如,处理特定的握手消息、调整密钥协商算法、验证国密证书等。这部分可能需要深入理解GmSSL的握手细节,并结合Netty的事件驱动模型进行代码编写。

  4. 测试与调试: 在完成上述改造后,进行全面的单元测试和集成测试,确保Netty在国密通信场景下的稳定性和安全性。对于可能出现的问题,如握手失败、加密解密异常等,应利用Netty提供的日志输出、调试工具等进行细致排查。

四、关于 SM2-WITH-SMS4-SM3加密套件

GMSSL guanzhi/GmSSL 加密套件SM2-WITH-SMS4-SM3其实属于GM/T SSL-VPN CipherSuites 套件,从源码就可以看到

image-20240415193421784

五、编译

参考连接Netty集成国密开源基础密码库Tongsuo_netty 集成国密ssl-CSDN博客

其实这个博客写的已经把大概流程都写好了,但是是基于tongsuo的,我这边是基于guanzhi/GmSSL,

​ Netty调用Netty-tcnative组件,Netty-tcnative调用集成Openssl算法库的JNI动态库。集成思路:将Openssl替换为guanzhi/GmSSL。

​ Netty编译需要依赖Netty-tcnative组件。Netty-tcnative使用Maven编译时会去下载密码库代码,编译密码库组件,并将密码库的库文件静态依赖到JNI动态库中。由此完成Netty到密码库的通道加密的调用。

Netty-tcnative再linux编译比较好编译,但是再window编译,我尝试了各种办法,总是编译失败,所以我采用半自动的方式进行编译,Netty-tcnative会生成临时文件,直接用vs打开,设置openssl的头文件和静态库路径,然后生成静态库,静态库改个名字放到jar包里边,其实自动编译也是这个原理哈哈O(∩_∩)O

image-20240415195115476

image-20240415195253656

netty改造实现

c端代码 修改openssl-dynamic中sslcontent.c文件中的make方法中更换为NTLS的握手方式;扩展setCertificate方法 增加对国密双证的支持。直接传输五个证书的路径吗,之前有的是说要转成x509之类的,转来转去的有点麻烦,这个是直接传输证书路径,由底层gmssl去解析,格式必须是pem格式

TCN_IMPLEMENT_CALL(jboolean, SSLContext, setCertificateExt)(TCN_STDARGS, jlong ctx,
                                                         jstring enccert, jstring enckey,
                                                         jstring signcert, jstring signkey,
                                                         jstring password)
{
   
#ifdef OPENSSL_IS_BORINGSSL
    tcn_Throw(e, "Not supported using BoringSSL");
    return JNI_FALSE;
#else
    tcn_ssl_ctxt_t *c = J2P(ctx, tcn_ssl_ctxt_t *);
    TCN_CHECK_NULL(c, ctx, JNI_FALSE);
    jboolean rv = JNI_TRUE

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

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

相关文章

python 如何使用windows系统自带的定时功能运行脚本

亲测此定时可以在电脑重启后,仍会自动运行 1.搜索栏搜索‘任务’,打开任务计划程序,点击创建任务 2.写一下任务名称和描述 3.选择触发器,点新建,可以创建定时计划 4.默认只有一次,每天,每月&am…

BackTrader 中文文档(二十七)

原文:www.backtrader.com/ 数据 - 多个时间框架 原文:www.backtrader.com/blog/posts/2015-08-24-data-multitimeframe/data-multitimeframe/ 有时,使用不同的时间框架进行投资决策: 周线用于评估趋势 每日执行进入 或者 5 分钟…

解决 MSYS2 Qt 6.7 默认 stylesheet 在 windows 11 下的显示故障

项目场景: MSYS2 升级到 Qt6.7.0,发现显示故障,所有Qt6程序以及 QtCreator的SpinBox都显示不全,Combox的底色不对。 问题描述 2024年4月1日,pacman升级MSYS2后,Qt6遇到风格错误。如果使用官方的 Qt onlin…

CSS设置内外边距

目录 内边距(paddingj): 前言: 设置内边距: 外边距(margin): 前言: 设置外边距: 补充(折叠): 内边距(padding)&#…

【程序分享】bopcalc 程序:一种评估分子动力学模拟中键序参数的高效方法(二)

分享一篇使用一种评估键序参数的高效程序:bopcalc 。 感谢论文的原作者! 主要内容 “ 我们提出了一种新颖、高效的方法来评估键序参数 (BOP)。我们的方法利用球谐函数和 Wigner 符号的特性来减少 BOP 表达式中的项数,并采用归一化关联勒让德…

APP测试基本流程以及APP测试要点梳理,保证您看了不后悔!

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

使用Pandas解决问题:对比两列数据取最大值的五种方法

目录 一、使用max方法 二、使用apply方法结合lambda函数 三、使用np.maximum函数 四、使用clip方法 五、使用where方法结合条件赋值 总结: 在数据处理和分析中,经常需要比较两个或多个列的值,并取其中的最大值。Pandas库作为Python…

前端大屏项目适配方法

要在F11全屏模式下查看 方法一,rem font-size 动态设置HTML根字体大小 和 body 字体大小(lib_flexible.js) 将设计稿的宽(1920)平均分成 24 等份, 每一份为 80px。HTML字体大小就设置为 80 px&#xff…

OSPF大型实验

OSPF大型实验 实验拓扑图 实验思路 1、R4为ISP,其上只配置IP地址;R4与其他所直连设备间均使用公有IP; 2、R3-R5、R6、R7为MGRE环境,R3为中心站点; 3、整个OSPF环境IP基于172.16.0.0/16划分;除了R12有两…

智慧园区可视对讲广播解决方案

智慧园区可视对讲广播解决方案 目前而言智慧园区管理者主要需要解决的问题是: 1.面对庞大的园区小区规模,能源管理全部依赖人工已经无法实现; 2.节能管理工作难度大,面对问题,没有好的解决方案; 3.面临…

详解电源测试系统自定义报告模板功能:如何轻松实现数据导出

在NSAT-8000电源测试系统内,数据一般分为三级架构:原始数据、数据报告和数据分析。数据报告可以直接展示出电源模块的各项测试数据和测试结果,帮助用户评估电源性能,为电源的优化提升提供数据支持。 系统的记录报告板块展示着历史…

油价年内第五涨,92汽油正式进入8元时代

今天是2024年4月16日,最新消息!据国家发改委网站16日消息,根据近期国际市场油价变化情况,按照现行成品油价格形成机制,自2024年4月16日24时起,也就是今晚过完的零点开始,国内汽、柴油价格&#…

计算机网络:MAC地址 IP地址 ARP协议

计算机网络:MAC地址 & IP地址 & ARP协议 MAC地址IP地址ARP协议 MAC地址 如果两台主机通过一条链路通信,它们不需要使用地址就可以通信,因为连接在信道上的主机只有他们两个。换句话说,使用点对点信道的数据链路层不需要使…

FR107-ASEMI快恢复二极管FR107

编辑:ll FR107-ASEMI快恢复二极管FR107 型号:FR107 品牌:ASEMI 封装:DO-41 最大平均正向电流(IF):1A 最大循环峰值反向电压(VRRM):1000V 最大正向电压…

当当图书网数据采集分析:10万条数据的深入洞察

基于搜索结果,我将为您提供一个关于当当图书网数据采集的文章框架,假设我们已经有了10万条数据的采集结果。请注意,由于没有具体的数据文件,以下内容将是一个示例性的框架,您可以根据实际采集到的数据进行填充和调整。…

LeetCode: 209 长度最小的子数组

209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1…

C#创建磁性窗体的方法:创建特殊窗体

目录 一、磁性窗体 二、磁性窗体的实现方法 (1)无标题窗体的移动 (2)Left属性 (3)Top属性 二、设计一个磁性窗体的实例 (1)资源管理器Resources.Designer.cs设计 (2)公共类Frm_Play.cs (3)主窗体 …

【微信小程序之分包】

微信小程序之分包 什么是分包分包的好处分包前的结构图分包后的结构图分包的加载规则分包的体积限制使用分包打包原则引用原则独立分包独立分包的配置方法独立分包的引用原则分包预下载配置分包的预下载分包预下载限制 什么是分包 分包指的是把一个完整小程序项目,…

2016NOIP普及组真题 1. 金币

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1969 核心思想&#xff1a; 解法1、由于数据量只有 10000 天&#xff0c;估可以采用 模拟每一天 的方式。 #include <bits/stdc.h> using namespace std;int k 0;int main() {i…

掀起区块链开发狂潮!Scaffold-eth带你一键打造震撼DApp

文章目录 前言一、Scaffold-eth是什么&#xff1f;二、安装和配置1.准备工作2.安装3.配置开发环境 三、进阶使用1.放入自己的合约2.部署运行 总结 前言 前面的文章传送&#x1f6aa;&#xff1a;hardhat入门 与 hardhat进阶 在之前的文章中&#xff0c;我们已经探讨了使用Har…