Apache APISIX 玩转 Tongsuo 国密插件

news2025/1/12 8:07:28

fc840945b2f286922d8e86547f40ec9e.gif

 文|罗泽轩

Apache APISIX PMC

本文通过解读国密的相关内容与标准,呈现了当下国内技术环境中对于国密功能支持的现状。并从 API 网关 Apache APISIX 的角度,带来有关国密的探索与功能呈现。

本文 3446 字 阅读 11 分钟

1. 什么是国密 

顾名思义,国密就是国产化的密码算法。在我们日常开发过程中会接触到各种各样的密码算法,如 RSA、SHA256 等等。为了达到更高的安全等级,许多大公司和国家会制定自己的密码算法。国密就是这样一组由中国国家密码管理局制定的密码算法。在国际形势越发复杂多变的今天,密码算法的国产化替代,在一些领域已经成为了一股势不可挡的潮流。

国密的官方名称为国家商用密码,简称商密,拼音缩写是 SM。这也是国密标准中 SM2/3/4/7/9 等算法名称的来源。国密算法的命名方式非常简单直接,就像 “绵阳九所”、“二机部” 一样,都是 “分类+序号” 的组合。其中 SM1 和 SM4 是对称算法,对标 AES;SM2 是非对称算法,对标 RSA、ECDSA;SM3 是摘要算法,对标 MD5 等等。由于本文并非涉及到国密的实现细节,所以不会讲得非常细,也就科普下国密算法的分类。

在基础的国密算法之上,我们可以构造一个国密的垂直生态,比如实现国密算法的硬件、提供国密支持的密码库、加入国密流程的 TLS 握手协议等等。正如安全需要纵深防御一样,基于国密的信任链也需要有全软件栈上的支持。

因此,当我们谈论国密支持时,并不仅仅单独指可以用某一种国密算法进行加解密,而是指嵌合入国密的生态,支持某种国密的应用场景。

2. 国密的应用场景 

作为国家密码管理局制定的密码算法,国密广泛应用于电子政务(包括国家政务通、警务通等重要领域)、信创及金融业的各个应用领域。

  • 政府和金融的身份认证终端。依照现行有关规定,许多涉及政府和金融的身份认证终端(诸如 USBKey、智能 IC 卡、银行卡终端等)都需要提供对国密的支持。

  • 国产开源操作系统。许多主打国产替代的开源操作系统,会提供基于国密的安全加固功能。比如龙蜥操作系统 (Anolis OS) 提到自己实现了全栈国密能力;OpenEuler 也在做国密相关的一些功能,比如基于国密数字证书扩展了 EFI 的数字签名。

  • 信创产品。还有许多做信创生意的厂商,围绕国密推出符合相关标准的产品。例如支持使用国密算法做数字签名的 PDF 工具、支持国密接入标准的音视频软件等等。

  • 基于国密 TLS 协议的生态。也是在日常开发中接触得最多的。譬如各种国产CA厂商、支持了国密TLS的许许多多密码库和浏览器,以及国密接入的VPN和网关等等。

    .

3. APISIX 对国密的探索与支持 

Apache APISIX 是一个动态、实时、高性能的 API 网关,提供负载均衡、动态上游、灰度发布、精细化路由、限流限速、服务降级、服务熔断、身份认证、可观测性等数百项功能。作为一个发迹于国内环境的 API 网关,APISIX 自然需要考虑下如何接入国密的生态圈。

由于国密更多地用在国内环境中,尚未被 OpenSSL 等国际主流项目所完全接纳。如果要使用国密的功能,就涉及到更换 APISIX 默认的 OpenSSL 库为其他 SSL 库。

为此,我们考察了以下的项目:

  • GMSSL:北京大学开源的项目。原版基于 OpenSSL 1.0.2 修改而来。新的 GMSSL 3.0 基本上是重新开发,跟 OpenSSL 的目录结构差别很大。

  • gm-BoringSSL:个人开源项目,在 BoringSSL 上增加国密支持。已有两年未改动。

  • TaSSL:北京江南天安科技有限公司开源的项目。基于 OpenSSL 1.1.1 修改而来。

  • Tongsuo:蚂蚁集团开源的项目。基于 OpenSSL 3.0 修改而来,项目前身是 BabaSSL,现已改名为铜锁/Tongsuo

由于 GMSSL 3.0 并不基于 OpenSSL,即使能保证 API 兼容,也没办法确保能 100% 替换现有 OpenSSL 的行为,所以被首先排除。其次 gm-BoringSSL 疏于维护,也被排除。

在 TaSSL 和 Tongsuo 之中,我倾向于选择 Tongsuo[1]。因为 Tongsuo 在标准上拥有更强的话语权,比如 RFC 8998(TLS 1.3 中支持 SM 套件)就是由 Tongsuo 的开发者制定的。TaSSL 则是每出一个版本,就公布一个新的仓库。比如前一个版本[2],感觉不太靠谱。

对于选择 Tongsuo,我个人存在一个顾虑,就是他目前基于OpenSSL 3.0的版本还没有发布正式的 release 版本(第一个版本预计在2023年2月发布)。由于 Tongsuo 当前还没有一个固定的版本,因此社区决定先把国密相关的功能独立出来,以插件形式存在,有相关需求时可单独启用。

目前已在插件层面实现了服务端一侧国密双证书的支持,感兴趣的读者可以在官网查看 gm 插件介绍文档 插件介绍文档[3],自行完成 APISIX 的编译和对应插件的安装配置工作。当然,如果想即刻预览该插件的使用过程,也可以直接参考下文内容。

4. 快速参考:APISIX 国密插件的使用 

启用插件

插件要求 Apache APISIX 运行在编译了 Tongsuo 的 APISIX-Base 上。

首先需要安装 Tongsuo (此处我们选择编译出 Tongsuo 的动态链接库):

# TODO: use a fixed release once they have created one.
# See https://github.com/Tongsuo-Project/Tongsuo/issues/318
git clone https://github.com/api7/tongsuo --depth 1
pushd tongsuo
./config shared enable-ntls -g --prefix=/usr/local/tongsuo
make -j2
sudo make install_sw


其次需要构建 APISIX-Base,让它使用 Tongsuo 作为 SSL 库:

export OR_PREFIX=/usr/local/openresty
export openssl_prefix=/usr/local/tongsuo
export zlib_prefix=$OR_PREFIX/zlib
export pcre_prefix=$OR_PREFIX/pcre

export cc_opt="-DNGX_LUA_ABORT_AT_PANIC -I${zlib_prefix}/include -I${pcre_prefix}/include -I${openssl_prefix}/include"
export ld_opt="-L${zlib_prefix}/lib -L${pcre_prefix}/lib -L${openssl_prefix}/lib64 -Wl,-rpath,${zlib_prefix}/lib:${pcre_prefix}/lib:${openssl_prefix}/lib64"
./build-apisix-base.sh


该插件默认是禁用状态,你需要将其添加到配置文件 ./conf/config.yaml 中才可以启用它:

plugins:
  - ...
  - gm

由于 APISIX 的默认 cipher 中不包含国密 cipher,所以我们还需要在配置文件 ./conf/config.yaml 中设置 cipher:

apisix:
  ...
  ssl:
    ...
    # 可按实际情况调整。错误的 cipher 会导致 “no shared cipher” 或 “no ciphers available” 报错。
    ssl_ciphers: HIGH:!aNULL:!MD5

配置完成后,重新加载 APISIX,此时 APISIX 将会启用国密相关的逻辑。

测试插件

在测试插件之前,需要准备好国密双证书。Tongsuo 提供了生成【SM2 双证书】的 教程[4]

在下面的例子中,我们将用到如下的证书:

# 客户端加密证书和密钥
t/certs/client_enc.crt
t/certs/client_enc.key

# 客户端签名证书和密钥
t/certs/client_sign.crt
t/certs/client_sign.key

# CA 和中间 CA 打包在一起的文件,用于设置受信任的 CA
t/certs/gm_ca.crt

# 服务端加密证书和密钥
t/certs/server_enc.crt
t/certs/server_enc.key

# 服务端签名证书和密钥
t/certs/server_sign.crt
t/certs/server_sign.key


此外,还需要准备 Tongsuo 命令行工具。

./config enable-ntls -static
make -j2
# 生成的命令行工具在 apps 目录下
mv apps/openssl ..


你也可以采用非静态编译的方式,不过就需要根据具体环境,自己解决动态链接库的路径问题了。以下示例展示了如何在指定域名中启用 gm 插件。

要在指定域名中启用 gm 插件的功能,需要先创建对应的 SSL 对象:

#!/usr/bin/env python
# coding: utf-8

import sys
# sudo pip install requests
import requests

if len(sys.argv) <= 3:
    print("bad argument")
    sys.exit(1)
with open(sys.argv[1]) as f:
    enc_cert = f.read()
with open(sys.argv[2]) as f:
    enc_key = f.read()
with open(sys.argv[3]) as f:
    sign_cert = f.read()
with open(sys.argv[4]) as f:
    sign_key = f.read()
api_key = "edd1c9f034335f136f87ad84b625c8f1"
resp = requests.put("http://127.0.0.1:9180/apisix/admin/ssls/1", json={
    "cert": enc_cert,
    "key": enc_key,
    "certs": [sign_cert],
    "keys": [sign_key],
    "gm": True,
    "snis": ["localhost"],
}, headers={
    "X-API-KEY": api_key,
})
print(resp.status_code)
print(resp.text)


然后将上面的脚本保存为 ./create_gm_ssl.py ,运行以下命令:

./create_gm_ssl.py t/certs/server_enc.crt  t/certs/server_enc.key t/certs/server_sign.crt t/certs/server_sign.key


输出结果如下:

200
{"key":"\/apisix\/ssls\/1","value":{"keys":["Yn...


完成上述准备后,可以使用如下命令测试插件是否启用成功:

./openssl s_client -connect localhost:9443 -servername localhost -cipher ECDHE-SM2-WITH-SM4-SM3 -enable_ntls -ntls -verifyCAfile t/certs/gm_ca.crt -sign_cert t/certs/client_sign.crt -sign_key t/certs/client_sign.key -enc_cert t/certs/client_enc.crt -enc_key t/certs/client_enc.key


其中,./openssl 是上文提到的 Tongsuo 命令行工具, 9443 是 APISIX 默认的 HTTPS 端口。

如果一切正常,可以看到连接已经建立了起来,并输出如下信息:

...
New, NTLSv1.1, Cipher is ECDHE-SM2-SM4-CBC-SM3
...

禁用插件

如果不再使用此插件,可将 gm 插件从 ./conf/config/yaml 配置文件中移除,然后重启 APISIX 或者通过插件热加载的接口触发插件的卸载。

5.相关链接 

如果你对该功能或者插件感兴趣,欢迎在随时在社区进行交流。

[1] https://github.com/Tongsuo-Project/Tongsuo

[2] https://github.com/jntass/TASSL-1.1.1k

[3] https://apisix.apache.org/zh/docs/apisix/next/plugins/gm/

[4] https://www.yuque.com/tsdoc/ts/sulazb

钉钉用户交流群群号:44810299

钉钉交流群二维码👇

2c58934767ca71ef5f8b474f9e36fff1.jpeg

 了解更多...

铜锁/Tongsuo Star 一下✨:
https://github.com/Tongsuo-Project/Tongsuo

   本周推荐阅读  

198972b15d48bd67e7551e82e305f96e.jpeg

你好,我的新名字叫“铜锁/Tongsuo”

5577cc9fa860931de02fc01b00de8ff8.png

BabaSSL:支持半同态加密算法 EC-ElGamal

0469284860f4bf83958dc68addb363a9.png

Tongsuo 支持半同态加密算法 Paillier

66783d5163f6a5d46fda704c188527ad.png

开源项目文档社区化!Tongsuo/铜锁实践

a52032b6c07f0e1b07b0c042cc4601ac.jpeg

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

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

相关文章

元素的显示与隐藏

元素的显示与隐藏 本质&#xff1a;让一个元素在页面中隐藏或者显示出来 1、display属性 源代码 display属性用于设置一个元素应如何显示 display: none; 隐藏对象 display: block; block除了转换为块元素之外&#xff0c…

软件测试基础理论体系学习5-静态测试的理解

5-静态测试的理解1 介绍2 静态测试技术2.1 代码检查2.1.1 代码走查2.1.2 编码风格与规范2.1.3 审查2.1.3.1 代码审查和代码走查2.1.3.2 代码审查清单2.2 静态结构分析2.3 代码质量度量1 介绍 静态测试包括包括代码检查、静态结构分析、代码质量度量等。它可以由人工进行&#…

友芝友生物冲刺港交所上市:极其依赖单一供应商,周鹏飞为董事长

12月9日&#xff0c;Wuhan YZY Biopharma Co.,LTD.&#xff08;武汉友芝友生物制药股份有限公司&#xff0c;下称“友芝友生物”&#xff09;向港交所提交上市申请材料&#xff0c;计划在港交所主板上市&#xff0c;中信建投国际为其独家保荐人。 此前&#xff0c;贝多财经曾在…

Spark零基础入门实战(六)使用IntelliJ IDEA创建Scala项目

IntelliJ IDEA(简称IDEA)是一款支持Java、Scala和Groovy等语言的开发工具,主要用于企业应用、移动应用和Web应用的开发。IDEA在业界被公认为是很好的Java开发工具,尤其是智能代码助手、代码自动提示、重构、J2EE支持等功能非常强大。 在IDEA中安装Scala插件 在IDEA中安装…

【Keras计算机视觉OCR】文字识别算法中DenseNet、LSTM、CTC、Attention的讲解(图文解释 超详细)

觉得有帮助麻烦点赞关注收藏~~~ 一、OCR文字识别的概念 利用计算机自动识别字符的技术&#xff0c;是模式识别应用的一个重要领域。人们在生产和生活中&#xff0c;要处理大量的文字、报表和文本。为了减轻人们的劳动&#xff0c;提高处理效率&#xff0c;从上世纪50年代起就开…

GPR学术报告学习-刘四新 主持

钱荣毅 道路空洞 1 设备 天线矩阵 不能完全覆盖调查区域&#xff0c; 存在差异&#xff1a; 难以发现动态发育特征&#xff0c; 数据采集难以实现3D 全覆盖&#xff0c; 高频上探测深度浅&#xff0c; 通道间存在差异。 数据需要校准。。。主要A-SCAN的地面抖动矫正。 异常区…

【EmonCMS】开源数据处理平台安装教程

EmonCMS 安装教程1.EmonCMS平台介绍&#xff1a;2. EmonCMS安装2.1在 Ubuntu中安装2.2.在树莓派中安装3.安装完毕Emoncms是作为该项目的一部分开发的开源web应用程序&#xff0c;用于处理、记录和可视化能源、温度和其他环境数据。Emoncms从OpenEnergyMonitor监控硬件接收数据&…

VS Code 上已有200万+ Java 开发者!

大家好&#xff0c;我们很高兴与大家分享一个好消息&#xff0c;现在 Visual Studio Code 上已有超过200万 Java 开发者&#xff0c;这要来自于长期社区以及用户的支持&#xff0c;所以谢谢你们&#xff01; 对于11月的更新&#xff0c;我们为您带来了全新的代码编辑功能&…

运行 Jmeter 文件生成 HTML 测试报告,我选择 ANT 工具

概述 ant 是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具&#xff0c;大多用于 Java 环境中的软件开发。 在与 Jmeter 生成的 jmx 文件配合使用中&#xff0c;ant 会完成jmx计划的执行和生成jtl文件&#xff0c;并将jtl文件转化为html页面进行查看。 还可…

类加载器和反射

1.通过全限定名&#xff1a;包名类名&#xff08;类名可能会重复&#xff0c;所以要加包名&#xff09;&#xff0c;然后用流拷贝到内存中&#xff0c;并在内存中创建一个class对象用来存储这个class文件的成员信息 类加载过程http://t.csdn.cn/FDnaa 在验证之前会把该类中引…

CRM的开发

开发步骤1.首页的开发2.由首页跳转到登陆页面3.用户登录4.记住密码实现5.安全退出6.登录验证7.创建市场活动8.分页查询市场活动9.删除市场活动10.修改市场活动11.批量导出市场活动12.导入市场活动13.查看市场活动明细14.添加市场活动备注15.删除市场活动备注16.修改市场活动备注…

分分钟搭建出nginx的https服务

nginx添加https协议一、https是什么&#xff1f;二、创建步骤1.安装nginx2.创建证书三、验证四、浏览器访问在windows安装证书总结nginx 192.168.122.50一、https是什么&#xff1f; HTTPS &#xff08;全称&#xff1a;Hypertext Transfer Protocol Secure &#xff09;&…

分布式文件存储系统Minio,tuling,fox,p3 5:27

MinIO | 高性能&#xff0c;对Kubernetes友好的对象存储 一 分布式文件系统应用场景 fastDFS 缺点&#xff1a; 部署麻烦。因为文件名是自动生成的&#xff0c;所以如果要处理文件的话&#xff0c;还要经过额外的编码。Minio介绍 应用场景 互联网海量非结构化数据的存储需求…

Spring常见注解

普通CURD框架结构 1、controller 控制器&#xff08;注入服务&#xff09;用于标注控制层&#xff0c;相当于struts中的action层 2、service 服务&#xff08;注入dao&#xff09;用于标注服务层&#xff0c;主要用来进行业务的逻辑处理 3、repository/Mapper&#xff08;实…

25.前端笔记-CSS-溢出的文字省略号展示

1、单行文本溢出显示省略号 满足条件&#xff1a; &#xff08;1&#xff09;先强制一行内显示文本 white-space:nowrap;/*默认不写&#xff0c;或值是normal自动换行*/) &#xff08;2&#xff09;超出的部分隐藏 overflow:hidden; &#xff08;3&#xff09;文字用省略号代…

ESPnet-SE 开源工具介绍

下面是我们整理的钱彦旻教授、张王优、李晨达在第二届SH语音技术研讨会和第七届Kaldi技术交流会的报告内容&#xff0c;如果有误&#xff0c;欢迎指正。 基本情况 今天我们主要是围绕ESPnet-SE这个工具做一个简单的介绍&#xff0c;我会大概讲一下ESPnet-SE的情况&#xff0c;…

一文了解宏内核和微内核

【推荐阅读】 纯干货&#xff0c;linux内存管理——内存管理架构&#xff08;建议收藏&#xff09; 轻松学会linux下查看内存频率,内核函数,cpu频率 一文了解Linux内核的Oops 一篇长文叙述Linux内核虚拟地址空间的基本概括 需要多久才能看完linux内核源码&#xff1f; 内核是操…

微信小程序第五篇:页面弹出效果及共享元素动画

系列文章传送门&#xff1a; 微信小程序第一篇&#xff1a;自定义组件详解 微信小程序第二篇&#xff1a;七种主流通信方法详解 微信小程序第三篇&#xff1a;获取页面节点信息 微信小程序第四篇&#xff1a;生成图片并保存到手机相册 目录 一、page-caontainer 实现假页弹出 …

LDP协议介绍

LDP介绍 1.LDP协议概述 LDP&#xff08;Label Distribution Protocol&#xff09;规定了标签分发过程中的各种消息以及相关的处理过程。LSR之间将依据本地转发表中对应于一个特定FEC的入标签、下一跳节点、出标签等信息联系在一起&#xff0c;从而形成标签交换路径LSP。 2.L…

【Python恶搞】Python实现祝福单身狗的恶搞项目,快发给你的怨种大兄弟 | 附源码

前言 halo&#xff0c;包子们上午好 咱就说&#xff0c;谁还没有一个单身的小伙伴呢 今天这个代码主要是为了祝福咱们单身的小伙伴 咱就说废话不多说&#xff0c;直接上才艺 相关文件 关注小编&#xff0c;私信小编领取哟&#xff01; 当然别忘了一件三连哟~~ 公众号&#x…