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

死磕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_BORINGSSLtcn_Throw(e, "Not supported using BoringSSL");return JNI_FALSE;
#elsetcn_ssl_ctxt_t *c = J2P(ctx, tcn_ssl_ctxt_t *);TCN_CHECK_NULL(c, ctx, JNI_FALSE);jboolean rv = JNI_TRUE

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

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

相关文章

ORA-00742 ORA-00312 恢复---惜分飞

有客户反馈,断电之后数据库启动报ORA-00742和ORA-00312,无法正常open 我们远程上去尝试open库结果也报同样错误 [oracleoldhis oradata]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Wed Apr 10 09:40:03 2024 Copyright (c) 1982, 2013, Oracle. A…

Yolo-world使用

1、安装 python pip install ultralytics 前往官网下载模型:https://docs.ultralytics.com/models/yolo-world/#key-features 我这里使用yolov8s-world.pt举例 最简单的使用示例 if __name__ __main__:model YOLO(model/yolov8s-world.pt)results model.pre…

Blender2.83 下载地址及安装教程

Blender是一款开源的3D计算机图形软件,广泛应用于动画制作、游戏开发、建模、渲染等领域。它提供了一套强大的工具和功能,让用户能够进行三维建模、动画制作和视觉效果的创作。 Blender支持多种文件格式的导入和导出,使用户能够与其他软件进…

JMeter控制器数据库获取一组数据后遍历输出

目录 1、测试计划中添加Mysql Jar包 2、添加线程组 3、添加 jdbc connection configuration 4、添加JDBC Request,从数据库中获取数据 5.获取数据列表,提取所有goodsName信息 6.通过添加控制器遍历一组数据 6.1 方式一:循环控制器方式 …

微信小程序订阅消息授权弹窗问题整理

文档 小程序订阅消息(用户通过弹窗订阅)开发指南 | 微信开放文档 1.报错10004 errCode: 10004errMsg: "requestSubscribeMessage:fail Invalid template id" 真机调试也不行 wx.requestSubscribeMessage({tmplIds: result,// 用户同意与否…

大数据平台搭建2024(二)

二:Hive安装 只在node01上操作 1 安装MySQL 8.0 最小化安装需要安装这个 yum install -y wget1-1 下载MySQL的yum源 wget http://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm检查是否安装成功 rpm -qpl mysql80-community-release-el7-7.n…

c++ 中文转拼音的封装, char 类型 不支持 中文 已解决

在日常业务中&#xff0c;需要进行中文转拼音的检索。已便实现对应的 模糊搜索。 使用方法 std::string res "我是中国人";char* result new char[res.length() 1];for (int i 0; i < res.length(); i){result[i] res[i];}result[res.length()] \0;std::str…

(六) 盘古UI,深度封装flexbox,轻松实现各种tag类型,让快速开发更自由!

(六) 盘古UI,深度封装flexbox,PanguFlexBoxView轻松实现各种tag类型,让快速开发更自由! 盘古UI,较为全面的自定义UI框架,帮助你绝对的快速开发!(长期维护中) demo地址,点击查看github 盘古PanguFlexBoxView 可以实现各种tag类型的UI需求,包含颜色和点击选中等! 1, 样例展示…

普通人如何零基础进入AIGC大模型人形机器人赛道,自学攻略,应用转化项目案例

要进入人形机器人赛道&#xff0c;普通人需要了解和掌握一系列的技能和知识&#xff0c;包括机器人设计、编程、电子工程、机械工程以及团队合作和项目管理。以下是一个详细的指南&#xff0c;帮助你从零基础开始&#xff0c;逐步进入这个充满挑战和机遇的领域。 基础教育和技能…

4月16号总结

java学习 网络编程 1.网络分层 网络分层是将网络通信划分为不同的逻辑层次&#xff0c;每一层负责特定的功能&#xff0c;从而实现网络通信的模块化和标准化。常用的网络分层模型包括OSI&#xff08;开放系统互联&#xff09;模型和TCP/IP模型。 特点和作用&#xff1a; 分…

网络安全学习路线-超详细

零基础小白&#xff0c;到就业&#xff01;入门到入土的网安学习路线&#xff01; 在各大平台搜的网安学习路线都太粗略了。。。。看不下去了&#xff01; 建议的学习顺序&#xff1a; 一、网络安全学习普法&#xff08;心里有个数&#xff0c;要进去坐几年&#xff01;&#x…

浅谈Java的synchronized 锁以及synchronized 的锁升级

在Java中&#xff0c;synchronized关键字用于实现线程间的同步&#xff0c;确保同一时刻只有一个线程能够访问被同步的代码块或方法。当一个线程获得synchronized锁定后&#xff0c;其他试图访问同一锁的线程将被阻塞&#xff0c;直到锁被释放。 synchronized锁有两种基本形式…