支持国密算法和标准的OpenSSL分支-GmSSL
2016-06-03 20:40:00 阿炯

GmSSL是支持国密算法和标准的OpenSSL分支,增加了对国密SM2/SM3/SM4算法和ECIES、CPK、ZUC算法的支持,实现了这些算法与EVP API和命令行工具的集成,采用C/C++开发并在ApacheV2协议下授权。GmSSL由北京大学信息安全实验室开发和维护。

GmSSL是一个开源的密码工具箱,支持SM2/SM3/SM4/SM9/ZUC等国密(国家商用密码)算法、SM2国密数字证书及基于SM2证书的SSL/TLS安全通信协议,支持国密硬件密码设备,提供符合国密规范的编程接口与命令行工具,可以用于构建PKI/CA、安全通信、数据加密等符合国密标准的安全应用。GmSSL作为OpenSSL的分支,与OpenSSL保持接口兼容。因此GmSSL可以替代应用中的OpenSSL组件,并使应用自动具备基于国密的安全能力。GmSSL项目采用对商业应用友好的类BSD开源许可证,开源且可以用于闭源的商业应用。

GmSSL项目由北京大学关志副研究员的密码学研究组开发维护,项目源码托管于GitHub。自2014年发布以来,已经在多个项目和产品中获得部署与应用,并获得2015年度“一铭杯”中国Linux软件大赛二等奖(年度最高奖项)与开源中国密码类推荐项目。项目的核心目标是通过开源的密码技术推动国内网络空间安全建设。



关键特性


支持SM2/SM3/SM4/SM9/ZUC等全部已公开国密算法
支持国密SM2双证书SSL套件和国密SM9标识密码套件
高效实现在主流处理器上可完成4.5万次SM2签名
支持动态接入具备SKF/SDF接口的硬件密码模块
支持门限签名、秘密共享和白盒密码等高级安全特性
支持Java、Go、PHP等多语言接口绑定和REST服务接口


GmSSL的libcrypto密码库增加的密码算法包括:
SM2是国密椭圆曲线公钥密码标准,其中包含数字签名、公钥加密和密钥交换三个具体方案,以及一个256比特素域上的推荐椭圆曲线参数。GmSSL内置了SM2的推荐曲线参数,实现了SM2的签名算法和公钥加密算法。
SM3是国密密码杂凑算法标准,输出的杂凑值长度为256比特。
SM4是国密分组密码标准,又名SMS4,其分组长度和密钥长度均为128比特。GmSSL实现了SMS4密码及SMS4的ECB、CBC、CFB、OFB等工作模式。
X9.63 KDF是密钥派生函数国际标准之一,ECIES和SM2公钥加密方案依赖该算法,GmSSL实现了X9.63 KDF,并用于支持ECIES和SM2公钥加密。
ECIES (Elliptic Curve Integrated Encryption Scheme)是椭圆曲线公钥加密的国际标准,可用于加密数据。
CPK是由南相浩和陈钟设计的基于身份的密码。GmSSL实现了CPK的系统建立和密钥生成算法,生成的密钥可以用于DSA、ECDH、ECDSA、ECIES、SM2等公钥密码算法。
ZUC(祖冲之算法)是由我国设计的序列密码,以32位字为单位输出密钥流,其密钥长度和IV长度均为128比特。GmSSL的ZUC算法处于开发中。


主要功能

密码算法
分组密码:SM4 (CBC, CTR, GCM), AES (GCM)
序列密码:ZUC/ZUC-256, ChaCha20, RC4
哈希函数: SM3, SHA-224/256/384/512, SHA-1, MD5
公钥密码算法:SM2, SM9, ECDH, ECDSA
椭圆曲线参数:SM2, NIST-P256
伪随机数生成器:HASH_DRBG (NIST.SP.800-90A)
MAC算法:HMAC, GHASH
密钥导出函数:PBKDF2、HKDF

PKI相关标准
数字证书:X.509证书, CRL, CSR (PKCS #10)
私钥加密格式:口令加密私钥PEM格式 (PKCS #8)
数字信封:SM2加密签名消 (GM/T 0010-2012)

SSL协议
TLCP 1.1,支持密码套件:ECDHE_SM4_CBC_SM3 {0xE0,0x11} (GB/T 38636-2020、GM/T 0024-2014)
TLS 1.2,支持密码套件:ECDHE_SM4_CBC_SM3 {0xE0,0x11} (GB/T 38636-2020、GM/T 0024-2014、RFC 5246)
TLS 1.3,支持密码套件:TLS_SM4_GCM_SM3 {0x00,0xC6} +ECDHE/SM2 (RFC 8998), TLS_AES_128_GCM_SHA256 + ECDHE/ECDSA/NIST-P256


路线图

目前GmSSL 3.0的基本功能已经开发完毕,并在GmSSL develop 分支发布,预计于2022年内发布正式版本。3.0版本具有更快、更小、更安全的特点,相比于GmSSL 2.0我们主要从以下方向进行改进:
采用CMake替代目前基于Perl的构建系统
支持Linux/Windows/macOS/Android/iOS等主流操作系统,移除对嵌入式OS等其他系统的支持
支持X86/ARM/RISC-V,针对上述平台64位指令集做汇编层面的优化
将C语言标准由目前的C89更新为最新的C99或C11,及部分GCC特性,移除对Perl的依赖
移除不安全的算法和协议,仅支持国密算法和主流国际算法,提升对AEAD、TLS 1.3等新标准的默认支持力度
提升密码算法抗木马、抗侧信道攻击的安全性
降低运行时堆内存的使用量,降低总体二进制代码体积
提供特定于国密算法和协议的统一的多语言(支持Rust/Java/Go/PHP)封装
保持和OpenSSL最新版本的兼容性,实现GmSSL和OpenSSL在同一个软件中的共存

国密算法

国密算法是国家商用密码算法的简称。自2012年以来,国家密码管理局以《中华人民共和国密码行业标准》的方式,陆续公布了SM2/SM3/SM4等密码算法标准及其应用规范。其中“SM”代表“商密”,即用于商用的、不涉及国家秘密的密码技术。其中SM2为基于椭圆曲线密码的公钥密码算法标准,包含数字签名、密钥交换和公钥加密,用于替换RSA/Diffie-Hellman/ECDSA/ECDH等国际算法;SM3为密码哈希算法,用于替代MD5/SHA-1/SHA-256等国际算法;SM4为分组密码,用于替代DES/AES等国际算法;SM9为基于身份的密码算法,可以替代基于数字证书的PKI/CA体系。通过部署国密算法,可以降低由弱密码和错误实现带来的安全风险和部署PKI/CA带来的开销。


国密SSL协议与标准TLS协议的区别

国密 SSL协议在GM/T中没有单独规范的文件,而是在SSL VPN技术规范中定义了国密SSL协议。GMT 0024-2014《SSL VPN技术规范》中,国密 SSL协议内容参照传输层安全协议(RFC 4346 TLS1.1),按照我国相关密码政策和法规,结合我国实际应用需求及实践经验,在TLS 1.1的握手协议中,增加了ECC、IBC的认证模式和密钥交换模式,取消了DH密钥交换方式,修改了密码套件的定义,另外就是增加了网关到网关协议。

协议概述
国密SSL协议包括握手协议、密码规格变更协议、报警协议、网关到网关协议和记录层协议。握手协议用于身份鉴别和安全参数协商;密码规格变更协议用于通知安全参数的变更;报警协议用于关闭通知和对错误进行报警;网关到网关协议用于建立网关到网关的传输层隧道;记录层协议用于传输数据的分段、压缩及解压缩、加密及解密、完整性校验等。

握手协议
国密SSL握手协议族包含密码规格变更协议、握手协议和报警协议3个子协议,用于通信双方协商出可供记录层使用的安全参数,进行身份验证以及向对方报告错误等。

国密SSL握手协议协商的会话包括:
会话标识:有服务端选取的随意的字节序列,用于识别活跃或可恢复的会话
证书:X.509 V3格式的数字证书,符合GM/T 0015
压缩方法:压缩数据的算法
密码规格:指定的密码算法
主密钥:客户端和服务端共享的48字节的密钥
重用标识:标明能否用该会话发起一个新连接的标识

利用以上数据可以产生安全参数,利用握手协议的重用特性,可以使用相同会话建立多个连接。

密码套件
国密SSL协议定义了支持的密码套件列表,每个密码套件包括一个密钥交换算法、一个加密算法和一个校验算法。服务端将在密码套件列表中选择匹配的密码套件,如果没有可匹配的密码套件,则握手失败、关闭连接。国密SSL协议标准中实现ECC和ECDHE的算法是SM2,实现IBC和IBSDH的算法是SM9;RSA算法的使用应符合国家密码管理主管部门的要求。

协议号
TLS协议号为0x0301/ 0x0302/ 0x0303,分别表示TLS 1.0/TLS 1.1 /TLS 1.2,而国密SSL版本号为0x0101。

证书报文
国密SSL协议规范定义发送证书时需要发送两个证书——签名证书和加密证书,与标准TLS报文格式一样,只是第一个证书是签名证书,第二个证书是加密证书。

中国早在10年前已经对网络安全引起高度重视,并随之相继出台了《密码法》、《网络安全法》、《数据安全法》、《关键信息基础设施保护条例》等重要法规,这些法规从不同层面强调了实现网络安全技术自主可控的重要性,明确了对关键信息基础设施的保护是世界各国网络空间博弈的重要战场。

就技术层面而言,以应用较为广泛的SM2、SM3、SM4三种国产密码为例,国密算法在加密强度或运算性能上都优于同类国际通用算法。尤其是非对称加密算法SM2,密码复杂度高、处理速度快、机器性能消耗小,因而也更加的安全和优越。为网站部署服务器证书即SSL证书,是提升网站服务器防护能力的重要措施,也是在浏览器使用者及网页服务器之间进行加密通讯的全球化标准。近年来,国家有关机构相继发文要求现有的基于RSA算法的电子认证系统、密钥管理系统、应用系统进行升级改造,使用性能更为优越的国密SM2算法。随着国密算法应用的加速推进,为网站服务器部署支持SM2算法的国密SSL证书构建起严密的信息安全“防火墙”。

国密SSL证书有什么优势
国密算法是我国在密码核心领域自主研发的技术成果,在应用环境不可控的情况下,使用自主可控的国产密码技术加密数据,是保护我国网络信息安全最有效的方式,同时具有以下优势:
1).安全优势
防钓鱼、防篡改、100%国产化、安全可控。

2).技术优势
·响应速度比RSA算法快
·256位国产密码算法较2048位的RSA国际算法加密强度高
·国密SSL服务器证书兼容所有国产(信创)系统。

3).国家政策支持
符合国家相关政策,应对合规性检查
·《中华人民共和国网络安全法》
·《网络安全等级保护2.0》系列文件
·《关键信息基础设施安全保护条例》

在当前网络攻击和信息泄露频发的环境下,数安时代将持续与生态伙伴深化合作,通过更深度的产品集成,基于电子政务业务场景,为更多网站提供更有价值的国密改造方案;持续推动国产密码算法在全行业的应用,共同营造安全、可信的数字环境,保障企业和个人的信息安全。


GmSSL提供命令行工具gmssl,可用于生成SM2签名、SM3摘要、HMAC-SM3消息认证码,支持SM4和ZUC数据加解密。

$ echo -n abc | gmssl dgst -sm3
66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0

显示SM2推荐椭圆曲线域参数

$ gmssl ecparam -text -noout -name sm2p256v1 -param_enc explicit

在代码目录./certs/sm2/目录中给出了SM2证书的例子,可以用gmssl工具进行解析

$ gmssl x509 -text -noout -in certs/sm2/sm2-x509.pem
$ gmssl pkcs7 -print_certs -in certs/sm2/sm2-pkcs7.pem

GmSSL新增的EVP对象包括EVP_sm3()、EVP_sm4_ecb()、EVP_sm4_cbc()、EVP_sm4_ofb()、EVP_sm4_cfb()和EVP_zuc()。

最新版本:3.0
GmSSL的2.x版本的开发始于2016年,目前主分支在功能上实现了对主要国密算法、标准和协议的覆盖,并成功应用于多种互联网场景中。但是随着GmSSL在物联网、区块链等新场景中的应用,及在密码产品合规检测过程中的实践,发现应用对GmSSL提出了一些新的需求。由于很难在基于OpenSSL的GmSSL 2.x版本上满足新需求,因此重新设计了GmSSL的架构,GmSSL也迎来第三个大版本——GmSSL 3.0:采用了cmake构建系统,主要新特性如下:
超轻量:GmSSL 3.0大幅度降低了内存需求和二进制代码体积,不依赖动态内存,可以用于无操作系统的低功耗嵌入式环境(MCU、SOC等),开发者也可以更容易地将国密算法和SSL协议嵌入到现有的项目中。
更合规:GmSSL 3.0 可以配置为仅包含国密算法和国密协议(TLCP协议),依赖GmSSL 的密码应用更容易满足密码产品型号检测的要求,避免由于混杂非国密算法、不安全算法等导致的安全问题和合规问题。
更安全:TLS 1.3在安全性和通信延迟上相对之前的TLS协议有巨大的提升,GmSSL 3.0支持TLS 1.3协议和RFC 8998的国密套件。GmSSL 3.0默认支持密钥的加密保护,提升了密码算法的抗侧信道攻击能力。
跨平台:GmSSL 3.0更容易跨平台,构建系统不再依赖Perl,默认的CMake构建系统可以容易地和Visual Studio、Android NDK等默认编译工具配合使用,开发者也可以手工编写Makefile在特殊环境中编译、剪裁。


官方主页:http://gmssl.org/
该文章最后由 阿炯 于 2022-10-02 21:34:39 更新,目前是第 2 版。