国密网站目前都是用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。具体过程为:
-
服务器发送SM2公钥(在 加密证书 中)到客户端。
-
客户端生成Pre-Master Secret,用SM2公钥加密后传送给服务器。
-
服务器使用SM2私钥解密,得到Pre-Master Secret,通过一定的处理得到Master Secret,再次处理得到会话密钥,这个也是一个SM4对称加密算法的密钥。
-
客户端使用同样推导算法从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];
和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
来源:oschina
链接:https://my.oschina.net/u/4324623/blog/4310391