chromium中添加国密协议

强颜欢笑 提交于 2020-08-15 10:34:51

国密网站目前都是用SSL ECC_SM4_SM3密码套件。在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。

首先需要添加国密算法的协议支持。

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报文格式一样,但至少要包含两个证书,签名证书在前,加密证书在后。

4. Certificate Verify

证书的验签,需要用签名证书做服务器的签名证书验证。

5. 密钥交换

国密的密钥交换和RSA的密钥交换类似,参考标准的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,加密发送给对方。如果双方的密钥不同,校验不会通过。

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报文定义为:

struct {
          opaque verify_data[12];
      } Finished;

      verify_data 为数据校验,产生方法:
          PRF(master_secret, finished_label, SM3(handshake_messages)) [0..11];
Finished消息

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

 

参考:

国密协议规范:https://blog.csdn.net/upset_ming/article/details/79880688

从chrome源码看https:https://zhuanlan.zhihu.com/p/34041372

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!