【密评】SSL VPN知识点记录

客户端ClientHello

ClientVersion

TLCP版本是1.1,值是0101

Random


客户端随机数,共32字节,暂且命名为ClientRandom

  • 4字节时间,格式为unix32位,内容是格林威治1970年1月1日到现在的秒数。用于抗重放。
  • 28字节随机数。

哪些密钥需要用到Random作为材料呢?

  1. 预主密钥
  2. 主密钥
  3. 工作密钥

SessionID

无关,值由服务端决定

CipherSuites


客户端支持的密码套件,优先级高的靠前,每个密码套件指代三部分:密钥交换算法、加密算法、校验算法。具体值参照后面的知识点 密码套件值。

CompressionMethod

无关,压缩算法


服务端ServerHello

ServerVersion

TLCP版本是1.1

Random

共32字节,暂且命名为ServerRandom

  • 4字节时间,格式为unix32位,内容是格林威治1970年1月1日到现在的秒数。
  • 28字节随机数

SessionID

无关

CipherSuite


服务端从客户端支持的套件列表中最终选择的密码套件。

CompressionMethod

无关,压缩算法

服务端Certificate

(GM/T 20518)

分别为签名证书加密证书
暂且命名为ServerCertificate1ServerCertificate2
右键→导出分组字节流即可导出证书,看证书用法确定是什么证书,但这样只能看到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
3045022100e4795b5a947526f8e7cbd0edd571ea8749e0efd24323799346ea2c740c006c5a0220026189e51c19d20d40a82606d0ed72cb9530a189bbb94c09e4559d7d8ff3f598

可以看到签名的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原理


【密评】SSL VPN知识点记录
https://eudonomia.eu.org/posts/c284d296.html
作者
Eschaton
发布于
2024年7月29日
许可协议