专栏首页大龄程序员的人工智能之路详解国密SSL ECC_SM4_SM3套件

详解国密SSL ECC_SM4_SM3套件

国密算法最好的应用场景应该是SSL/TLS通信,然而国密文档中并没有单独规范SSL/TLS协议,我们能参考的只有《GM/T 0024-2014 SSL V** 技术规范》。这份文档并没有像RFC那样描述得很详细,在实现上可能会存在很多不清楚的地方。很多时候,我们还要去翻看标准TLS 1.1的RFC4346。

本文主要总结国密SSL ECC_SM4_SM3密码套件的实现需要注意的地方。

因为国密SSL是以TLS 1.1标准为蓝本制定的,所以这里主要总结国密SSL协议和标准的TLS协议之间的区别。

在SSL通信中,最重要的是通信握手,握手成功后,就可以通过加密通道进行通信,握手过程如下:

SSL握手

1. 协议版本

TLS协议定义有三个版本号,为0x0301、0x0302、0x0303,分别对应TLS 1.0、1.1、1.2。国密SSL估计是担心与未来的TLS版本号冲突,选择了0x0101。这在实现上带来一定的麻烦,因为现有很多网络库会认为这是一个无效的协议版本,需要一一将判断修改过来。

国密SSL协议规范是TLS 1.1和TLS 1.2的混合体,大部分情况下参考TLS 1.1就可以了,少数地方又参考了TLS 1.2。在后面会指出哪些是参考了TLS 1.2的标准。

2. 加密算法

非对称加密、对称加密、摘要等算法都替换为国密标准。在ECC_SM4_SM3套件中,非对称加密算法为SM2,对称加密算法为SM4,摘要算法为SM3。

注意,PRF算法和TLS 1.2类似,而不是像TLS 1.1那样,实现时需要注意:

国密PRF函数定义

TLS1.2下,PRF中所使用的哈希算法可根据选择,比如SHA256,而GM SSL的算法固定为SM3。

3. Certificate报文

国密规范规定发送证书时需要发送两个证书:签名证书和加密证书(双证书体系)。关于双证书请参考我之前的文章:

啥?双证书?

与标准TLS报文格式一样,但至少要包含两个证书,签名证书在前,加密证书在后。如果牵扯到证书链,问题就复杂了,而且协议这里也没有规定清楚。是签名证书 + 证书链 + 加密证书,还是签名证书 + 加密证书 + 证书链?在实现中发现TASSL采用的是前者,而沃通测试网站采用后者。在编码时请注意,最好是两者都兼容。

4. Certificate Verify

证书的验签流程和标准ECC证书的验签流程也不同,请参考《GMT 0003.2-2012 SM2椭圆曲线公钥密码算法第2部分:数字签名算法》,在后面我会详细写一写SM2的数字签名算法。

5. 密钥交换

实现时请参考RSA的密钥交换,而不要参考椭圆曲线密钥交换算法ECDH或ECDHE,这点需要注意。具体过程为:

  1. 服务器发送SM2公钥(在加密证书中)到客户端。
  2. 客户端生成Pre-Master Secret,用SM2公钥加密后传送给服务器。
  3. 服务器使用SM2私钥解密,得到Pre-Master Secret,通过一定的处理得到Master Secret,再次处理得到会话密钥,这个也是一个SM4对称加密算法的密钥。
  4. 客户端使用同样推导算法从Pre-Master Secret计算出Master Secret,然后再计算得到会话密钥。因为双方都是从同样的Pre-Master Secret值,使用同样的密钥派生算法计算出会话密钥,所以最后会得到同样的会话密钥。

在握手协议的最后一步,双方会互相发送Finished消息,其中就包含VerifyData,加密发送给对方。如果双方的密钥不同,校验不会通过。

关于SM2加密 Pre-Master Secret,请参考我之前的文章:

详解国密SM2的加密和解密

Server Key Exchange消息中包含的数据如下:

Server Key Exchange消息

刚开始还不明白其中的

Opaque ASN.1Cert<1, 2^24-1>;

指的是什么,该如何处理这个消息。后来才明白,对于ECC_SM4_SM3套件而言,会话密钥其实主要由客户端决定。对于客户端而言,这个消息不处理也没有问题,所以我把这个消息的处理略过了。开发服务器端的朋友可以补充一下,说说这个证书指的是哪个证书,我估计是加密证书。

6. Finished报文

Finish报文的内容也和TLS 1.1有差别,TLS 1.1的定义为:

      struct {
          opaque verify_data[12];
      } Finished;

      verify_data
          PRF(master_secret, finished_label, MD5(handshake_messages) +
          SHA-1(handshake_messages)) [0..11];

而国密SSL的Finished报文定义为:

Finished消息

和TLS 1.2标准类似,但TLS 1.2可以使用标准的SHA1、SHA256、SHA384等进行hash运算,而国密SSL中,hash运算固定为SM3。

小结

在实现国密SSL的过程中,碰到不少的坑,其实有些地方要是有人稍微点拨一下,也不至于摸索得那么辛苦。现在我把总结出来的问题列出来,希望对大家有所帮助。

如果大家有什么问题,欢迎交流。

文章分享自微信公众号:
云水木石

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

作者:陈正勇
原始发表时间:2020-03-29
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 国密SSL通信的调试技巧

    这篇文章来聊一聊国密SSL通信的几个调试技巧。网络通信开发需要开发者具有细致和耐心,对照协议,逐个步骤分析数据,整个过程有些枯燥。特别是网络数据包,差一个字节都...

    云水木石
  • 国密SSL协议之Java编程

    Java自身通过JCE和JSSE支持标准的SSL协议,但并不支持国密SSL协议。本文描述了Java使用国密JCE和国密JSSE开发一个简单的客户端程序,连接国密...

    gmssl
  • 国密SSL协议之Tomcat集成

    Tomcat自身支持标准的SSL协议,但并不支持国密SSL协议。本文描述了Tomcat配置的国密SSL协议(单向)的完整过程,仅供学习和参考之用。

    gmssl
  • 国密SSL协议之性能测试

    国密SSL性能指标主要有三个:新建速率(CPS,Connection per second)、加密吞吐(Throughput)、最大并发连接(Max Persi...

    gmssl
  • 国密SSL协议之Nginx集成

    Nginx自身支持标准的SSL协议,但并不支持国密SSL协议。本文描述了Nginx配置的国密SSL协议(单向)的完整过程,仅供学习和参考之用。

    gmssl
  • 国密SSL协议之Apache集成

    Apache httpd自身支持标准的SSL协议,但并不支持国密SSL协议。本文描述了Apache httpd配置的国密SSL协议(单向)的完整过程,仅供学习和...

    gmssl
  • 国密SSL协议之C语言编程

    OpenSSL支持标准的SSL协议,但并不支持国密SSL协议。本文描述了C语言使用国密版OpenSSL开发一个简单的客户端程序,连接国密Web网站,发送HTTP...

    gmssl
  • SSL通信双方如何判断对方采用了国密

    SSL通信涉及两方的参与者,通常采用的模型是Client/Server。如果我们开发Client端产品(比如浏览器),可能会和多方的Server产品对接。那么问...

    云水木石
  • 案例|教育行业如何利用国密SSL证书保障信息安全?

    在教育行业中,如何做好教育信息化网络与信息安全保障体系的基础防护措施?其中很重要的一点,便是根据等保要求,采用商用密码技术维护网络数据的完整性、保密性和可用性...

    腾讯云DNSPod团队
  • 详解国密SM2的加密和解密

    在上一篇文章《解读国密非对称加密算法SM2》介绍了国密非对称算法SM2,在文章中说到,如果现有的网络库中已经实现ECC算法,只需加入SM2命名曲线的参数即可。这...

    云水木石
  • 详解国密SM2的数字签名

    在《解读国密非对称加密算法SM2》一文中,我讲到过非对称加密算法的用途之一就是数字签名。本文就来聊一聊国密SM2的数字签名算法。

    云水木石
  • 长安链ChainMaker国密TLS设计与实现

    互联网上传输的数据,每时每刻都存在着被窃听和篡改的风险,SSL/TLS协议在保护用户数据机密性、完整性以及身份鉴别等方面发挥了重大作用。国际通用TLS协议并不包...

    bengbengsu
  • DNSPod国密SSL证书重磅上线!全线证书6000元代金券可领

    众所周知,证书是一种能够在服务器和浏览器之间的信息交换过程中实现通信安全的有效工具,在企业网站、邮件和文档等安全保护中扮演着重要角色。 而一个重要数据现实是,...

    腾讯云DNSPod团队
  • TLCP的过去、现在与未来

    Internet和WWW的出现,掀起了信息化浪潮而且经久不衰。如果现实世界一样,有价值的数据和信息,引来了了各种攻击和威胁,信息安全变得越来越重要。作为互联网基...

    用户8941398
  • JumpServer国密支持配置

    HTTPS 国密证书配置在JumpServer前端的Nginx服务器,用户通过本地的国密支持的浏览器访问到Nginx服务器,此链路为国密HTTPS加密链路,Ng...

    范一刀
  • 坚持自主可控,长安链ChainMaker全面拥抱国密的技术实践

    密码技术作为与核技术、航天技术并列的国家三大安全核心技术之一,在保障信息安全,增强我国行业信息系统的“安全可控”等方面具有关键作用。长期以来国际上较为通用的商用...

    bengbengsu
  • 初识国密算法

    国密算法是国家商用密码算法的简称,由国家密码管理局管理和发布标准。国家密码管理局的官方网站是:

    云水木石

扫码关注腾讯云开发者

领取腾讯云代金券