死磕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.rhkb.cn/news/311832.html

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

相关文章

怎么转行做产品经理?

小白转产品经理第一点要先学基础理论知识,学了理论再去实践,转行,跳槽! 学理论比较好的就是去报NPDP的系统班,考后也会有面试指导课、职场晋升课程,对小白来说非常合适了~(B站:不爱…

微软正式发布Copilot for Security

微软公司近日宣布,其备受期待的安全自动化解决方案——Copilot for Security现已全面上市,面向全球用户开放。这一创新工具的推出标志着微软在提升企业安全防护能力方面迈出了重要一步,同时也为安全专业人士提供了强大的支持。 Copilot for …

图数据库Neo4J入门——Neo4J下载安装+Cypher基本操作+《西游记》人物关系图实例

这里写目录标题 一、效果图二、环境准备三、数据库设计3.1 人物节点设计3.2 关系设计 四、操作步骤4.1 下载、安装、启动Neo4J服务4.1.1 配置Neo4J环境变量4.1.2 启动Neo4J服务器4.1.3 启动Ne04J客户端 4.2 创建节点4.3 创建关系(从已有节点创建关系)4.4…

百度智能云万源全新一代智能计算操作系统发布:引领AI新纪元,开启智能未来

随着科技的迅猛发展,人工智能(AI)逐渐渗透到我们生活的每个角落,为人类社会带来前所未有的变革。在这场科技革命的浪潮中,百度作为中国AI领域的领军企业,始终站在技术创新的前沿,不断引领行业发…

数字电路(四,五章总结)

四.组合逻辑电路设计 由波形图列真值表,之 后画出卡诺图,写出最简逻辑表达式。 卡诺图化简的时候圈住的部分如果某个字母有0又有1的话这个字母删掉,写出其他两个字母。 如下图中黄圈A有0又有1则删除A,这样黄圈代表BC;同理绿圈代…

35、链表-LRU缓存

思路: 首先要了解LRU缓存的原理,首先定下容量,每次get请求和put请求都会把当前元素放最前/后面,如果超过容量那么头部/尾部元素就被移除,所以最近最少使用的元素会被优先移除,保证热点数据持续存在。 不管放…

【Java】@RequestMapping注解在类上使用

RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一。这个注解会将 HTTP 请求映射到控制器(controller类)的处理方法上。 Request Mapping 基础用法 在 Spring MVC 应用程序中,RequestDispatcher (在 Front Controller 之下) 这…

MapReduce 机理

1.hadoop 平台进程 Namenode进程: 管理者文件系统的Namespace。它维护着文件系统树(filesystem tree)以及文件树中所有的文件和文件夹的元数据(metadata)。管理这些信息的文件有两个,分别是Namespace 镜像文件(Namespace image)和操作日志文件(edit log)&#xff…

命令模式

命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 命令模式的好处: 1、它能较容易地设计一个命令队列; 2、在需要的情况下&a…

【Phytium】飞腾D2000 UEFI/EDK2 适配 RTC(IIC SD3077)

文章目录 0. env1. 软件2. 硬件 10. 需求1. 硬件2. 软件 20. DatasheetCPURTC 30. 调试步骤1. 硬件环境搭建2. UEFI 开发环境搭建3. 修改步骤1. UEFI 中使能RTC驱动、配置RTC信息等1.1 使能RTC驱动1.2 修改RTC对应的IIC配置信息1.3 解决驱动冲突1.4 验证波形 2. 修改对应RTC驱动…

1、MYSQL系列-深入理解Mysql索引底层数据结构与算法

索引的本质 索引是帮助MySQL高效获取数据的排好序的数据结构 索引数据结构 二叉树红黑树Hash表BTree B-Tree B-Tree 叶节点具有相同的深度,叶节点的指针为空,所有索引元素不重复,节点中的数据索引从左到右递增排列 BTree(B-Tree变种) 非叶…

使用FastDDS编译IDL文件

1.安装FastDDS环境 Ubuntu22.04 1.1安装依赖的软件 sudo apt-get update //基础工具安装 sudo apt install cmake g python3-pip wget git //Asio 是一个用于网络和低级 I/O 编程的跨平台C库,它提供了一致的 异步模型。 TinyXML2是一个简单,小巧&…

Leetcode 4. 寻找两个正序数组的中位数

心路历程: 这道题暴力解很简单,一看到要求O(log(mn))的复杂度就只能是双指针,但是实测发现这道题用归并排序更快。这可能就是平均复杂度和实际复杂度的Gap吧。 二分法的思路: 要找到第 k (k>1) 小的元素,那么就取…

利用redis和fastapi实现本地与平台策略进行交互

redis在pandas一文有详细使用方法(一文教会pandas-CSDN博客),具体可视化软件有redisstudio等。它是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。 Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络…

NTC热敏电阻采集温度-单片机通用模板

NTC热敏电阻采集温度-单片机通用模板 一、NTC热敏电阻转换温度的原理二、AT104Tem.c的实现三、AT104Tem.h的实现 一、NTC热敏电阻转换温度的原理 ①NTC热敏电阻会随着温度的升高,电阻值R逐渐降低;②硬件搭建电阻分压电路采集ADC逆推热敏电阻当前的阻值&…

ArcGIS加载的各类地图怎么去除服务署名水印

昨天介绍的: 一套图源搞定!清新规划底图、影像图、境界、海洋、地形阴影图、导航图-CSDN博客文章浏览阅读373次,点赞7次,收藏11次。一体化集成在一起的各类型图源,比如包括影像、清新的出图底图、地形、地图阴影、道路…

如何在PPT中获得网页般的互动效果

如何在PPT中获得网页般的互动效果 效果可以看视频 PPT中插入网页有互动效果 当然了,获得网页般的互动效果,最简单的方法就是在 PPT 中插入网页呀。 那么如何插入呢? 接下来为你讲解如何获得(此方法在 PowerPoint中行得通&#…

Modality-Aware Contrastive Instance Learning with Self-Distillation ... 论文阅读

Modality-Aware Contrastive Instance Learning with Self-Distillation for Weakly-Supervised Audio-Visual Violence Detection 论文阅读 ABSTRACT1 INTRODUCTION2 RELATEDWORKS2.1 Weakly-Supervised Violence Detection2.2 Contrastive Learning2.3 Cross-Modality Knowle…

Yolo-world+Python-OpenCV之摄像头视频实时目标检测

上一次介绍了如何使用最基本的 Yolo-word来做检测,现在我们在加opencv来做个实时检测的例子 基本思路 1、读取离线视频流 2、将视频帧给yolo识别 3、根据识别结果 对视频进行绘制边框、加文字之类的 完整代码如下: import datetimefrom ultralytics …

excel 无法正确处理 1900-03-01 前的日期

问题由来:excel 用公式 TEXT(A1,"yyyy-mm-dd") 转日期时,当A1 的值等于59 的时候,返回值是1900-02-28;当A1 的值等于61 的时候,返回值是1900-03-01;那么当 A1的值为 60 的时候,返回值…