文|罗泽轩

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/pcreexport 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-8import sys
# sudo pip install requests
import requestsif 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

钉钉交流群二维码

Apache APISIX 玩转 Tongsuo 国密插件相关推荐

  1. fabric 国密改造

    背景 最近应公司项目需求,需要对fabric中的加密相关模块进行改造,主要目的是使fabric底层加密服务支持国密算法sm2.sm3以及sm4等.借这次机会,顺便熟悉一下fabric加密模块的源码实现 ...

  2. Apache APISIX 扩展指南

    Apache APISIX 提供了 50 多个插件.常用的几个负载均衡选择器,以及对主流服务发现(如 Nacos 和 DNS)的支持.API 网关和企业内部的业务紧密相关,为了满足企业的业务需求,用户 ...

  3. Nacos 在 Apache APISIX API 网关中的服务发现实践

    Apache APISIX 是一个动态.实时.高性能的 API 网关,提供负载均衡.动态上游.灰度发布.服务熔断.身份认证.可观测性等丰富的流量管理功能.它不仅拥有众多实用的插件,而且支持插件动态变更 ...

  4. 前端工程师怎么写后端?试试 koa.js + Apache APISIX 吧~

    前言 两年前,我还是一个小白开发者.当时为了上线我开发的一个网站购买了一个学生服务器,并且安装了 linux 服务器的小白之友 宝塔面板 ,相信现在还有很多朋友买到服务器了第一件事就是装个宝塔.在宝塔 ...

  5. Apache APISIX 携手 CoreDNS 打开服务发现新大门

    Apache APISIX 是一个动态.实时.高性能的云原生 API 网关,提供了负载均衡.动态上游.灰度发布.服务熔断.身份认证.可观测性等丰富的流量管理功能.作为云原生 API 网关,Apache ...

  6. API 网关 Apache APISIX 集成 Eureka 作为服务发现

    微服务架构中,大型复杂的系统按功能或者业务需求垂直切分成更小的子系统,这些子系统以独立部署的子进程存在,它们之间通过网络调用进行通信.这些独立部署的服务如何发现对方成为了首先要解决的问题,所以在微服务 ...

  7. 通过网页查看服务器算法,服务器使用国密(SM2/SM3/SM4)证书,通过浏览器访问

    1. Apache + Gmssl Apache 本身不支持国密,需要修改代码支持GMTLS 下载解压: wget http://archive.apache.org/dist/httpd/httpd ...

  8. 网关 Apache APISIX 在 360 基础运维平台项目中的实践

    女主宣言 今天小编为大家分享一篇关于Apache APISIX的文章,文章从开发者的角度讲述了 Apache APISIX 网关在 360 基础运维平台的落地实践,希望能对大家有所帮助. PS:丰富的 ...

  9. 开源之夏来啦,欢迎报名 Apache APISIX 项目!

    活动介绍 开源之夏(全称:开源软件供应链点亮计划--暑期 2021)是由中国科学院软件研究所与 OpenEuler 社区共同主办的一项面向高校学生的暑期活动,旨在鼓励在校学生积极参与开源软件的开发维护 ...

最新文章

  1. silverlight 无法发布 如何灵活配置IP
  2. 虞旦盛老师 的《数学分析续》课件
  3. 关于WordPress中字体加载慢的问题解决方案(转)
  4. mysql 获取自增id的值的方法
  5. [转]我们为什么要用vue,他解决了什么问题,如何使用它?
  6. qq浏览器翻译功能启用划词插件教程
  7. flutter 输入框限制输入 数字、小数
  8. 用javascript写Android和iOS naitve应用,实在炫酷。
  9. hssfworkbook 单元格合并后宽度不生效_一起来学习Excel批量合并单元格的操作技巧...
  10. 人生路上必须明白的七个哲理[转]
  11. CSS的一些基本样式的简单介绍
  12. tensorflow学习笔记(三十四):Saver(保存与加载模型)
  13. Oracle 临时表详解(temporary table)
  14. miniPCIE接口更换M.2/NGFF接口AX200无线网卡教程——华硕X450V笔记本更换intel AX200无线网卡
  15. python迷宫问题代码_Python解决走迷宫问题算法示例
  16. 笔记本的网络出现红叉,网络连接不上,网络不可用
  17. IOS客户端接入FaceB,SSO授权
  18. 编程爱好者网站试题中心
  19. 安卓基于Frida HOOK传感器 实现虚拟运动跑步
  20. Java语言对于大数据而言是什么样的存在?

热门文章

  1. python的OGR库获取geometry属性返回None,feature.geometry()
  2. Android逆向之源码刷机及Root
  3. CentOS 使用 yum 源安装 PHP 各版本、及 PHP 各扩展总结
  4. java语言中 逻辑常量_在 Java语言中 ,逻辑常量只有哪两个值 (true,false)_语文答案_学小易找答案...
  5. 计算机常用软件英文读音,常用软件,software,音标,读音,翻译,英文例句,英语词典...
  6. 量化趣谈——不务正业的数学家James Simons
  7. 词霸天下---词根234【-zo(o)- 动 物】
  8. Java IO练习--在程序中写一个“HelloJavaWorld你好世界“输出到操作系统文件Hello.txt文件中
  9. java基于springboot的股票交易模拟系统
  10. 怎么打开avi文件文件损坏_什么是AVI文件(以及如何打开一个文件)?