【密评】SSL VPN知识点记录

客户端ClientHello

ClientVersion
TLCP版本是1.1,值是0101
Random

客户端随机数,共32字节,暂且命名为ClientRandom
- 4字节时间,格式为unix32位,内容是格林威治1970年1月1日到现在的秒数。用于抗重放。
- 28字节随机数。
哪些密钥需要用到Random作为材料呢?
- 预主密钥
- 主密钥
- 工作密钥
SessionID
无关,值由服务端决定
CipherSuites

客户端支持的密码套件,优先级高的靠前,每个密码套件指代三部分:密钥交换算法、加密算法、校验算法。具体值参照后面的知识点 密码套件值。
CompressionMethod
无关,压缩算法
服务端ServerHello
ServerVersion
TLCP版本是1.1
Random
共32字节,暂且命名为ServerRandom。
- 4字节时间,格式为unix32位,内容是格林威治1970年1月1日到现在的秒数。
- 28字节随机数
SessionID
无关
CipherSuite

服务端从客户端支持的套件列表中最终选择的密码套件。
CompressionMethod
无关,压缩算法
服务端Certificate
(GM/T 20518)
分别为签名证书和加密证书。
暂且命名为ServerCertificate1和ServerCertificate2。
右键→导出分组字节流即可导出证书,看证书用法确定是什么证书,但这样只能看到tbs域中的内容,如果想看到完整内容要复制值然后丢进ASN.1 Editor,因为可以看到308X022X开头所以是ASN.1格式。参考知识点 证书结构。
服务端ServerKeyExchange
数据包中的该部分:
标准规定参考(GB_T 38636-2020 信息安全技术 传输层密码协议(TLCP)或者GM 0024)
可以从标准中看出,ServerKeyExchange一般是一个签名值,用于客户端计算产生48字节预主密钥。此处根据所使用的密钥交换协议,服务端签名内容会有所不同。
ECC时的签名
此时会对ClientRandom(32字节)、ServerRandom(32字节)、证书长度(3字节) 和ServerCertificate2进行签名,使用签名证书中的公钥(64字节) 验签。
签名证书中的公钥开头
- 若为04,则代表是完整公钥未压缩,后面是64字节
- 若为02,则代表仅有正数的x值32字节,y值需要计算出来
- 若为03,则代表仅有负数的x值32字节,y值需要计算出来
签名值为ASN.1格式,常以30450221 / 304X022X开头。
证书长度从包里证书那部分摘出来,如下图(00 02 25)
拼接数据后可以验签成功。
- 消息:ClientRandom(32字节)+ServerRandom(32字节)+证书长度(3字节)+ServerCertificate2(549字节)
- 公钥:签名证书中的公钥(64字节)
- 签名:处理后的签名64字节,参考后面签名值长度问题。
签名值长度问题
同ASN.1那篇文章中的问题,属于ASN.1的格式导致的。
这个地方可以看到这个值的长度是71字节,但SM2签名不是64字节么?多出来的7字节是哪里来的呢?我们把这个签名摘出来
1 | |
可以看到签名的30450221和中间的0220,可以确定是ASN.1格式的,故丢进ASN.1 Editor(用法参考【工具】中的文章),解码后得到
然后开头那个00可以去掉,去掉之后,这两个32字节拼起来就是64字节了。
ECDHE时的签名

此时会对ClientRandom(32字节)、ServerRandom(32字节) 和服务端ECDHE参数(参考GM/T0009)进行签名。
客户端ClientKeyExchange
ECC时

客户端产生48字节的预主密钥,经过服务端加密证书(ServerCertificate2)中的加密公钥加密后发送给服务端。相当于一个数字信封(非对称密钥加密对称密钥)。
预主密钥产生过程
- 46字节随机数:
- 2字节版本号:
SM2加密公钥加密过程


ECDHE时

附录-知识点
密码套件值
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS: 协议名
- ECDHE: 密钥交换算法
- RSA: 身份鉴别使用的非对称算法
- AES_128_GCM: 对称密码算法_算法强度_工作模式
- SHA256: 签名时使用的哈希算法,MAC或者PRF(伪随机函数,用于密钥生成)
国密
(GM_T 0024 SSL VPN技术规范)
(GB 38636 信息安全技术 传输层安全协议TLCP)
SM2包含三种用法:签名、公钥加密和密钥交换。
ECDHE使用的是SM2的密钥交换用法(GM_T 0003.3 SM2椭圆曲线公钥密码算法 第3部分:密钥交换协议)。
ECC使用的是SM2的公钥加密用法(GM_T 0003.4 SM2椭圆曲线公钥密码算法 第4部分:公钥加密算法)。
非国密
| TLS1.3中密码套件名称 | 值 |
|---|---|
| TLS_AES_128_GCM_SHA256 | {0x13, 0x01} |
| TLS_AES_256_GCM_SHA384 | {0x13, 0x02} |
| TLS_CHACHA20_POLY1305_SHA256 | {0x13, 0x03} |
| TLS_AES_128_CCM_SHA256 | {0x13, 0x04} |
| TLS_AES_128_CCM_8_SHA256 | {0x13, 0x05} |
| TLS1.3中的一系列升级: |
- 密钥交换算法只有ECDHE
- PRF升级为HKDF
- 禁止使用压缩
- 废除RC4、DES等传统对称加密算法
- 废除ECB、CBC等传统分组模式,使用GCM和CCM模式,可实现机密性和完整性。
- 废除MD5、SHA1等不安全摘要算法
- 废除RSA、DH密钥交换算法(因为RSA不具有前向安全性,如果有私钥,可以计算得到以前的预主密钥,从而解密以前的内容),
- TLS1.3中ServerHello之后的内容都被加密了,无法得到证书等内容。
- TLS1.2 / TLS1.3中密钥用法可能存在同一个证书既是签名证书又是加密证书
证书结构
证书分为三个域:tbsCertificate / signatureAlgorithm / signatureValue
正常我们打开一个证书文件,只能看到其第一部分(to be signed Certificate)
打开之后其中内容:
- 签名算法:上级CA对该证书的签名算法
- 公钥:公钥开头的04代表未压缩
- 指纹:有些是20字节的,就是SHA1摘要

- TLS1.2 / TLS1.3中密钥用法可能存在同一个证书既是签名证书又是加密证书
ECDHE原理
