死磕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_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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[C++][算法基础]二分图的最大匹配(匈牙利算法)

给定一个二分图,其中左半部包含 n1 个点(编号 1∼n1),右半部包含 n2 个点(编号 1∼n2),二分图共包含 m 条边。 数据保证任意一条边的两个端点都不可能在同一部分中。 请你求出二分图的最大匹配…

天池酒瓶瑕疵检测数据集分析及完整baseline

以下内容为还没思路的小伙伴牵个头提供一个demo,大佬勿喷,线上成绩0.7,留空间给小伙伴们发挥自己的力量 ps:markdown不怎么熟悉,代码中如有明显缩进问题,自行斟酌改正,编辑好几次都改不过来,请原谅.... 数据分析瑕疵大类: 瓶盖瑕疵、标贴瑕疵、喷码瑕疵、瓶身瑕疵、酒液瑕疵瑕…

会议室预约小程序开源版开发

会议室预约小程序开源版开发 支持设置免费预约和付费预约、积分兑换商城、积分签到等 会议室类目,提供多种类型和设施的会议室选择,满足不同会议需求。 预约日历,展示会议室预约情况,方便用户选择空闲时段。 预约记录&#xff0…

机器学习实验------决策树

第1关:什么是决策树 任务描述 本关任务:根据本节课所学知识完成本关所设置的选择题。 第2关:信息熵与信息增益 任务描述 本关任务:掌握什么是信息增益,完成计算信息增益的程序设计。 import numpy as npdef calcIn…

聚道云软件连接器助力企业实现滴滴出差报销自动化

一、客户介绍 某机械有限公司是一家在机械设备制造领域拥有深厚底蕴和卓越实力的企业。自公司成立以来,该公司始终秉承创新、务实、高效的发展理念,专注于机械设备的研发、生产和销售。经过多年的发展,公司已成为国内机械行业的佼佼者&#…

在Qt中如何简单设计一个文件和图像浏览器

文本浏览器 设计一个文本浏览器程序,可以打开、显示 txt、html等文件。 1.在Qt Designer中设计一个菜单其中包含打开和退出选项: 2. 在 QMainWindow 构造函数中把 textBrower 设为主窗口的中心部件,这样整个窗口就成了包含 textBrower 的单文…

书生·浦语2.0(InternLM2)大模型实战--Day04 XTuner微调 | 1.8B 多模态Agent

视频地址: https://b23.tv/QUhT6ni课程文档:https://github.com/InternLM/Tutorial/blob/camp2/xtuner/readme.md作业文档:https://github.com/InternLM/Tutorial/blob/camp2/xtuner/homework.md XTuner 微调个人小助手认知 在本节课中讲一步…

SQL刷题---2021年11月每天新用户的次日留存率

解题思路: 1.首先算出每个新用户注册的日期,将其命名为表a select uid,min(date(in_time)) dt from tb_user_log group by uid2.计算出每个用户登录的天数,将其命名为表b select uid,date(in_time) dt from tb_user_log union select uid,date(out_time) dt fro…

linux C -- 消息队列

linux C -- 消息队列 前言一、System V(IPC)消息队列接口调用主要涉及到 msgget、msgsnd、msgrcv 和 msgctl 四个接口: 1、创建消息队列 msgget2、发送消息到队列3、从队列接收信息4、控制消息队列 msgctl5、删除消息队列 二、代码编写1、发送部分的代码2、代码完成…

扭蛋机市场如何?全新淘宝扭蛋机小程序发展前景

近几年,扭蛋机市场发展的非常迅速,市场发展前景也在不断扩大。随着人们的生活水平提高,对娱乐消费也更加青睐,尤其是具有刺激性、惊喜性的消费模式。而扭蛋机具备的优势刚好符合大众对娱乐消费的要求,因此,…

Kafka服务端(含Zookeeper)一键自启软件

1. 前言 本文介绍了一款集成图形化界面配置和一键自启功能的Kafka与Zookeeper服务管理软件。该软件通过直观易用的图形界面,使用户能够轻松完成Kafka和Zookeeper的配置工作,有效避免了手动编辑配置文件可能带来的错误和不便。同时,软件还提供…

TCP网络程序

上一章我们基于UDP实现了几个网络程序,这一章我们开始使用TCP。 先简单复习一下TCP和UDP的特点: TCP特点 传输层协议有连接可靠传输面向字节流 UDP特点 传输层协议无连接不可靠传输面向数据报 可以看到TCP是有链接的,而UDP是无连接的&#…

简单3步,OpenHarmony上跑起ArkUI分布式小游戏

标准系统新增支持了方舟开发框架(ArkUI)、分布式组网和 FA 跨设备迁移能力等新特性,因此我们结合了这三种特性使用 ets 开发了一款如下动图所示传炸弹应用。 打开应用在通过邀请用户进行设备认证后,用户须根据提示完成相应操作&am…

2024-14.python前端+Django

第四篇 web前端 第1章 、Web的基本概念 前端基础总共分为三部分:html、css和js。 1.3、HTTP协议 1.3.1 、http协议简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW:World Wide Web &am…

神经网络压缩图像

简介 典型的压缩管道由四个组件组成: 编码:输入图像 x x x通过编码器函数 ε \varepsilon ε,将其转换为潜在表示 z z z。 量化:截断 z z z以丢弃一些不重要的信息 熵编码:使用某种形式的熵编码(例如&…

淘宝API商品详情数据在数据分析行业中具有不可忽视的重要性

淘宝商品详情数据在数据分析行业中具有不可忽视的重要性。这些数据为商家、市场分析师以及数据科学家提供了丰富的信息,有助于他们更深入地理解市场动态、消费者行为以及商品竞争态势。以下是淘宝商品详情数据在数据分析行业中的重要性体现: 请求示例&a…

OpenStack 入门体验

目录 一、云计算概述 1.1、什么是云计算 1.2、云计算的服务模型 1)IaaS 2)PaaS 3)SaaS 1.3、OpenStack 概述 1)OpenStack 起源 2)什么是 OpenStack 3)OpenStack 优势 二、OpenStack 一…

基于JavaWeb开发的springboot网约车智能接单规划小程序[附源码]

基于JavaWeb开发的springboot网约车智能接单规划小程序[附源码] 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种…

Java项目如何使用EasyExcel插件对Excel数据进行导入导出

文章目录 一、EasyExcel的示例导入依赖创建实体类数据导入和导出 二、EasyExcel的作用三、EasyExcel的注解 EasyExcel是一个阿里巴巴开源的excel处理框架,它以使用简单、节省内存著称。在解析Excel时,EasyExcel没有将文件数据一次性全部加载到内存中&…

使用 Flask 和 Flask-Login 构建用户认证的 Web 应用程序

在本篇技术博客中,我们将学习如何使用 Flask 框架和 Flask-Login 扩展构建一个具有用户认证功能的简单 Web 应用程序。我们将从创建 Flask 应用实例开始,然后逐步添加用户认证功能。 1. 安装依赖库 首先,确保您已经安装了 Flask、Flask-PyM…