写点什么

长安链国密 TLS 设计和实现学习

作者:
  • 2022 年 8 月 30 日
    湖南
  • 本文字数:1485 字

    阅读完需:约 5 分钟

本文已参与「开源摘星计划」,欢迎正在阅读的你加入。活动链接:https://github.com/weopenprojects/WeOpen-Star


1.国密软件产品存在以下问题也急需解决:

未形成国密权威密码实现库,开源生态不活跃

国密 TLS 实现不完善,各语言版本支持现状参差不齐。


2.国密算法套件包括 SM2 签名、SM2 非对称加密、SM3 杂凑函数 (哈希)、SM4 对称加密,以及一个国密密钥协商协议。要在安全信道中完全使用国密算法,对 TLS 协议实现、与其相关的 X509 协议实现都需要做大量的改造适配。应用层的协议 (GRPC、HTTP 等) 在实现上也需要做相应的适配。


3.整体设计思路

密码算法库:提供统一密码算法接口,支持不同密码算法以及实现的扩展。

密码协议库:支持标准 TLS,包括国际标准和国密标准

密码应用:长安链密码技术应用依赖于“密码算法库”和“密码协议库”,解耦具体实现细节。


4.长安链 TLS 支持现状

长安链后端服务采用 Golang 语言 实现,通过 grpc 对外提供区块链服务。生态工具 SDK 支持 Golang、Java 等不同语言。目前为止,长安链已经完成了区块链服务与客户端 SDK,区块链网络节点之间的 双向国密 TLS 通信 。


golang 服务端:底层基于 grpc 通信,其中 tls 握手采用长安链密码协议库(支持国密 TLS 以及国际 TLS 协议)

golang 客户端:同上

java 客户端:由于 java 调用长安链 golang 密码协议库支持国密 TLS,工作量较大并且维护困难,实现上采用了比较成熟的 netty-tcnative + 国密 openssl 方式。


密码算法库

长安链密码算法库 采用 golang 语言实现,目前支持主流国际密码算法 AES、RSA、ECC 以及 SHA 系列算法,并已经全面支持 SM2、SM3 以及 SM4 国密算法。底层国密实现目前采用了 tjfoc 密码库

密码协议库

长安链密码协议库 包含 国密 x509、国密 TLS ,并兼容国际 x509、国际 TLS 标准。 国密 TLS 实现库包含 golang 国密 tls 和 java 国密 tls 两个实现。

  1. golang 国密 tls:在 golang 标准库(golang1.14 版本)基础上,增加了 SM2 算法、SM3 算法、国密 X509 以及 SM2-SM3 算法套件支持,并独立为单独的国密协议库。

  2. java 国密 tls:包含国密算法部分和国密 TLS 协议两个部分。 国密算法部分 Java 侧由 Java 标准库 CurveDB 类 提供,国密通过反射机制注入到 Java 标准库,国密算法实现自主研发,符合国密算法标准。 国密 TLS 协议 部分主要由长安链 国密 openssl 提供,Java 侧通过反射机制将 SM3WithSM2 标识注入到 netty ssl io.netty.handler.ssl.ExtendedOpenSslSession 支持的签名算法 LOCAL_SUPPORTED_SIGNATURE_ALGORITHMS 列表中,Java netty 通过 netty-tcnative 调用 openssl 底层密码功能。目前 netty-tcnative 已支持 macOS、linux、windows 以及 linux_aarch 等平台,并在长安链 chainmaker-java-sdk 中实现了 平台兼容性 ,用户只要下载长安链官方 java sdk 就可以实现客户端与链的国密 TLS 通信,无需关心 netty-tcnative 国密的跨平台问题。

国密 openssl

长安链的国密 openssl 实现是在 OpenSSL-1.1.1l 的基础上改造的。OpenSSL 在 1.1.1 版本中引入了国密算法的实现,但是仅仅提供了算法接口,没有把国密算法引入到任何通信协议中去支持。 长安链国密 openssl 把国密算法的支持加入到 X509 协议 中。主要包括:

  1. 按 PKCS8 标准实现 SM2 私钥的编码序列化;

  2. 按 PKIX 定义的公钥编码方式实现 SM2 算法公钥的序列化;

  3. 实现 ECC 编码的 SM2 签名的序列化;

  4. 将 SM2 算法、SM3 算法、SM2-SM3 算法套件、SM2 曲线的 OID 引入到 X509 的逻辑中。

完成了 X509 协议的国密支持后,进一步改造了 TLS 协议 ,主要包括:

  1. 把国密算法套件加入到支持的密码算法包列表中,以供 server、client 两端进行算法套件的协商

  2. 在 ECDSA 对应的协议套件中去支持了国密算法的逻辑

  3. 身份认证阶段,使用改造过的 x509 协议进行国密证书验证。

用户头像

关注

还未添加个人签名 2018.05.04 加入

还未添加个人简介

评论

发布
暂无评论
长安链国密TLS设计和实现学习_李_InfoQ写作社区