解析 Anolis OS 的国密生态
编者注:本文系两位演讲者整理,他们在 2021 年阿里云开发者大会的「开源操作系统社区和生态分论坛」上带了分享,演讲主题为《国密技术开发与实践》。Anolis OS 国密是社区在 Anolis OS 上做的国密技术解决方案,非常欢迎业界有兴趣的开发者能够参与到 OpenAnolis 社区,为国内的基础软件生态添砖加瓦。
作者分别是阿里云技术专家张天佳与蚂蚁集团高级技术专家杨洋。张天佳主要负责 Anolis OS 上国密技术的开发和应用,参与实现了 libgcrypt 中的国密算法和 Linux 内核中的 SM2 算法;杨洋则主导开发了 BabaSSL,也是国内唯一的一个 OpenSSL 维护者,参与起草并推动 RFC8998 标准国际化。相信两位技术人的干货分享,能给开发者们带来一定的思考。
国密——密码算法的国产化
说到密码算法,大家一定很熟悉 MD5、AES、RSA 这些通用的国际标准算法,这也是目前我们普遍采用的密码学算法,它们在数据安全、通信、区块链等众多领域都有着广泛的应用。
众所周知,这些算法标准都是国外制定的,在某些情况下这会对国内信息安全有不利影响。当下有实力的国家,甚至有些大公司都制定了自己的算法标准。
顾名思义,国密就是密码算法的国产化,跟其它领域一样,密码算法的国产化已经势不可挡,这也是我们必须要做的事情。中国的国密算法为我们提供了一个新的选择,在必要的场合中可以选择替代那些国际主流算法,尤其是当下国际贸易冲突,技术封锁不可忽视的大环境下,大规模推广和采用国密算法将为国内重要的网络基础设施提供可靠的数据安全保障。
国密是什么?
我是谁,从哪里来?
国密是一个口语化的称呼,官方名称是国家商用密码,简称商密,拼音缩写是 SM,这也是国密标准中具体算法名字的来源。国密是用于商用的、不涉及国家秘密的密码技术。
国密标准完全由中国密码管理局制定,主要的技术实现也基本是国内开发人员完成的,这对摆脱国外的密码技术和产品依赖是非常有利的。
到哪里去?
自 2012 以来,SM2/3/4 的国密标准陆续公布,目前国密技术生态基本处于一个正在逐步走向成熟的阶段,但国内密码基础软件在采用国密算法方面仍处于碎片化的状态,比如我们经常可以看到各种个人或组织名义开源的支持国密算法的库;此外这些开源项目的安全更新和社区活跃也都做的不好。国密的推广仍然需要我们中国基础软件的开发者和用户共同努力。
2020 年 1 月 1 日,《中华人民共和国密码法》正式实施,从法律层面规范了国家商用密码的应用和管理,这也为推广和应用国密提供了必要的法律保障。
与国际算法的对比
这里是国密算法和国际通用算法的一个对比,可以直观地看到国密的一个基本情况:
针对各种常用的国际能用算法类型,比如对称算法,公钥算法和消息摘要算法,国密标准都定义了对应的相同功能的国密算法,比如 SM4 提供了与 AES 同样的加密强度,并且支持各种加密模式;SM2 是基于椭圆曲线的公钥算法,同时定义了非对称加解密,数字签名和密钥交换标准,相对于 RSA,SM2 的密钥更短,但支持的加密强度却更高;SM3 是国密定义的消息摘要算法标准,摘要长度是固定的256位,强度等同于 SHA256。
除了基础的算法,国密标准也定义了TLCP国密双证书协议,用以支持国内的传输层安全协议。这里还有一个好消息,今年三月份,TLS1.3+ 国密单证书协议正式被国际标准所承认,并且以 RFC8998 标准发布,这意味着我们可以选择在TLS1.3协议中使用完整的国密套件,目前我们也在联系正规浏览器厂商支持这个标准的实施和应用。
同时国密也定义了使用国密算法的 X509 证书,使用 SM3 哈希算法,SM2 算法作为数字签名,证书类型是 SM2-with-SM3。
对开发者来说,国密提供了一个选择,可以选择从国际通用算法平滑迁移过来。除此之外,国密还有其它一些算法标准,是不太常用的,比如 SM9,ZUC 算法等。
BabaSSL 的前世今生
BabaSSL 是主打国密的密码算法库,与 OpenSSL 1.1.1 保持兼容,作为国密的密码算法解决方案而诞生。
BabaSSL 是基于之前蚂蚁集团和阿里集团内部的 OpenSSL 版本合并而来,并首次进行了开源。BabaSSL 的含义是:灵巧、轻快且靠谱的密码学和 SSL/TLS 工具库。
BabaSSL 的绿色商标,是基于阿里的橙色和蚂蚁的蓝色混合而来,也意味着我们希望将 BabaSSL 打造成一个灵活、小巧并且健壮的基础密码学库。
BabaSSL 目前在阿里集团和蚂蚁集团内部得到了非常广泛的使用。从具体场景来看,有如下三个方面,分别是存储、网络和端上的设备。其中网络服务的场景,是BabaSSL 最大的支撑场景,例如淘宝、天猫、阿里云等各种涉及到链路加密的服务器端。此外移动端 App,例如支付宝手机 App 中集成了 BabaSSL 来实现多种密码学的能力。
开源
BabaSSL 已经在去年的10月份进行了开源,目前代码是托管在 OpenAnolis 上,当前开源的版本是 8.2.0,也是我们目前最新的稳定版本。
目前 BabaSSL 在阿里内部使用的版本和开源版本之间存在一定的差异,我们目前正在逐步把内部版本的功能特性迁移到开源版本上进行开源,最终变成一个统一的开源版本,那么届时阿里内部也完全依赖于这个开源的版本,而不会再保留内部的闭源版本。
特色功能
以下是 BabaSSL 当前最新稳定版本 8.2.0 的主要特色功能特性:
- 基于 OpenSSL 1.1.1,具备 OpenSSL 1.1.1 的全部能力并且保持兼容
- 支持国密 SM2、SM3 和 SM4,并对 OpenSSL 1.1.1 中所欠缺的 SM2 能力,比如 X509 证书的签发和验证功能进行了补全
- GM/T 0024 和 TLCP 国密双证书TLS协议
- 支持 RFC 8998:TLS 1.3+国密单证书
- 提供了对 IETF 正在标准化过程中的 Delegated Credentials
- 支持 IETF QUIC API 底层密码学能力
- 更加完善的 SM2 算法支持,比如 X.509 证书签发、验签的支持
- 正在申请软件密码模块一级资质
与 OpenSSL 对比
接下来是大家很关心的 BabaSSL 和 OpenSSL 这种老牌的密码算法库之间的区别:
从图上可以看到一些主要区别:
- 对于一些新的密码学技术标准,BabaSSL 会采取一种相对激进的策略快速跟进,比如在 IETF 中一些正在标准化流程中的技术方案,例如 delegated credentials、compact TLS 等,会进行原型的实现和快速跟进,而 OpenSSL 则是相对保守,因为 OpenSSL 社区的策略是原则上只实现已经发布了的国际标准和国家标准。
- 在对于国密算法、国密协议、国密的监管合规、云计算厂商的深度集成、以及国产化硬件等方面,BabaSSL 会进行更加深度和广泛的支持,而 OpenSSL 则支持的比较有限。
- 对于 API 的易用程度,由于没有历史包袱,所以 BabaSSL 可以提供更加简单易用的 API,而 OpenSSL 的 API 则相对复杂。对于资源受限的嵌入式设备,BabaSSL 会进行体积裁剪和内存使用量的规划,OpenSSL 则明确表示没有相关的计划。
未来规划
这个是一个后续 BabaSSL 未来的版本规划和特性支持,基本上是每半年一个版本,涵盖了多种新的密码领域技术的支持,包括对 IETF 的几个 RFC 草稿的实现、国产化硬件的支持以及未来对于后量子密码学以及同态加密等前沿技术的支持:
- 支持 MPK
- Encrypted SNI
- Compressed Certificate
- Compact TLS
- SM算法优化
- 支持国产化 CPU 的国密算法指令集
- 体积裁剪,内存使用量优化
- Tink API
- ZUC,SM9
- PQC
- 同态加密算法
国密生态架构
万事俱备,有了基础国密算法支持,我们便可以构建出一个围绕国密算法展开的基础软件生态。这是一个国密生态的垂直场景,也是我们在 Anolis OS 上的国密生态架构,同时它也是一个全栈国密解决方案:从底层固件,内核,到基础密码学库,在主要链路上做国密改造,最终形成一个完整的基于国密的安全信任链条。
图上右边是一些垂直的国密应用场景,比如 SecureBoot,IMA,内核模块签名,文件完整性校验等。
到目前为止,我们已经在 Linux 内核、BabaSSL、libgcrypt、gnulib 等主流的基础组件中支持了国密算法,这部分的工作都已经回馈到了上游开源社区,有兴趣的开发者可以直接拿来使用或者作为参考,这些特性功能之后也会率先在 Anolis OS 上输出,达到一个开箱即用的原生支持国密的 OS。
从中也能看到,国密生态涉及到的软件栈非常多,形态也是各种各样,要逐步完善这个生态,还有很长的路要走。近几年的国际技术封锁也给了我们做这件事的决心和动力。
目前我们已经和统信、海光等厂商有一些合作,也非常欢迎业界有兴趣的开发者能够参与到社区,一起来做这个事情,之后我们的工作都会在 Anolis 龙蜥社区以开源方式运作,秉着开放包容态度,继续补充完善这个生态,最终达到的一个目标是:整个安全信任链是完全建立在国密算法之上。
国密在 IMA 和 modsign 的应用
我们知道,密码学算法从来就是为安全服务的,我们来看两个在安全领域具体国密改造的例子。
IMA 是 Linux 内核提供一个文件完整性度量架构,用于检测文件是否被恶意篡改,内核模块签名的目的是类似的,用于检测模块的发行源头是否可信。它们都提供了自己的签名工具,签名工具依赖 BabaSSL 提供的 SM2 签名文件的能力,用于在用户态做签名。
文件签名的验证是在内核里完成的,由于内核不能直接使用应用层的库,为了支持在Linux内核里验证文件签名,我们在内核里实现了国密 SM2/3/4 算法以及国密证书的支持,用来验证签名是否合法。
通过对相应软件栈的改造,我们完全基于国密算法构建了 IMA 和内核模块签名的安全机制,而这些之前都是由国际算法来保证的。
全栈国密 SIG
以下是我们在 OpenAnolis 上的全栈国密 SIG,非常欢迎有兴趣的开发能参与到社区中来,为中国的基础软件安全添砖加瓦。
SIG 地址: https://openanolis.cn/sig/crypto