【学习笔记】TLS/SSL握手

前言:本篇将介绍TLS握手的实际握手过程,TLS握手创建了Client和Server之间"被保护的通道",2个单向通道用来保护批量数据的传输(通过Confidentiality、Integrity和Authentication),一个通道是从Client到Server,另一个是从Server到Client。本篇将介绍最基础的握手 - 即握手采用的是RSA密钥交换,并通过追条记录(Record)的形式来阐述该过程。

在整个握手的过程中,Client和Server会交换并计算特定的值。上图两侧的框是双方所拥有的信息。开始时,Server已经拥有了证书、公钥和私钥,

1、Handshake:Client Hello

第一条Record是Client Hello,里面包含5个部分

  • Version
    • 包含了Client所支持的TLS/SSL的最高版本
  • Random Number - 32 bytes / 256 bits
    • 前4个字节编码时间戳(防止两个拥有相同随机数的不同的Client Hello相互发送信息)
  • Session ID - 8 bytes / 32 bits
    • 00000...本篇中Client Hello的初始会话ID都是0
  • Cipher Suites
    • Client会发送它所支持的密码套件的列表,Server会从中挑选
  • Extensions
    • 如果有扩展的话会包含在握手中,本篇不包含扩展

2、Handshake:Server Hello

收到Client Hello后,Server会发出Server Hello,和Client Hello一样,包含5部分

  • Version
    • 包含了Server所支持的TLS/SSL的最高版本
  • Random Number - 32 bytes / 256 bits
    • 前4个字节编码时间戳
  • Session ID - 8 bytes / 32 bits
    • Server生成的用于识别后续会话密钥的值
  • Cipher Suites
    • Server(从Client发送的列表中)挑选的密码套件
  • Extensions
    • 如果有扩展的话会包含在握手中,本篇不包含扩展

在Client Hello和Server Hello之后,Client和Server都获得了额外的信息

  • 两者都知道了互相支持的TLS版本。如果Client发送说它支持TLS 1.3,Server返回说它支持TLS 1.2,这就表明两者互相支持的最高的版本是TLS 1.2,两者将用TLS 1.2协议进行握手
  • 两者都知道了互相的随机数(Client Random、Server Random)
  • 两者也知道未来会用来参考本次会话的ID
  • 互相同意的用来保护这次TLS会话的密码套件

3、Handshake:Certificate

这条记录包含了Server证书和完整的证书链,Client会收到证书和公钥。Client收到证书后会问自己2个问题:证书是否合法?(用CA公钥进行的签名可以验证其合法性,在此处Client拥有了其所需要的东西来验证该签名);Server是否是该证书的真正拥有者?(验证Server拥有与证书匹配的私钥,会由Key Exchange Record所验证)

4、Handshake:Server Hello Done

这是一条空的Record,表明Server此时没有更多信息进行发送;然而,握手的其他变体可能会要求Server发送更多信息。

5、Handshake:Client Key Exchange

Client Key Exchange有2个主要目的

  • 创建相互的密钥材料(例如,SEED Value种子值,Client和Server两者都用来生成会话密钥)
  • 证明Server确实是该证书的拥有者

2个目的都将由特殊的值所达成,即 Pre Master Secret,预主密钥。上图中用红色虚线框描述,表明该值是加密发送的

  • Pre Master Secret 的生成
    • Client生成 Pre-Master-Secret (包含48个字节)
      • 2 bytes - TLS/SSL Version
      • 46 bytes - Random(随机生成的)
    • 之后,Pre-Master-Secret 会被Server的公钥进行加密(Client已经有了,因为前面的Record中Server已经发送了)
    • Pre-Master-Secret 被加密后进行在线传输,唯一能提取该加密信息的,是拥有与之相匹配的私钥的一方,即有对应私钥的Server
    • 现在,两者就都拥有了 Pre-Master-Secret
  • Pre Master Secret 的生效(在本例中,该值被用作种子值,来生成TLS会话密钥)
    • 双方都有了匹配的SEED Value
      • 种子值被用来生成会话密钥
      • 预主密钥被用来生成主密钥(Master Secret)[ 将其他值与PreMasterSecret相结合,这些值是"master secret"文字字符串(包含在RFC里了)、Client Random和Server Random,这4个值会相互结合来生成Master Secret ]
      • 主密钥被用来生成会话密钥 [ 将其他值与Master Secret相结合,这些值是"Key expansion"文字字符串、Client Random和Server Random,这4个值会相互结合来生成会话密钥 ]
        • 至少生成4个会话密钥(2套不同的密钥):
          • 保护Client发送信息的Client Encryption Key和Client HMAC Key
          • 保护Server发送信息的Server Encryption Key和Server HMAC Key
    • 特定加密协议需要 I.V. 即 Initializational Vector,初始化向量,这是(PRF)计算必要的I.V.的步骤
    • 计算涉及PRF - P seudo R andom F unction,伪随机数函数
      • 生成任意长度的摘要的哈希算法

到此,Client和Server双方都有了完全相同的会话密钥;但是,Client或Server并不知道另一方拥有相同的密钥。

因而,余下的握手将给双方证明:另一方拥有正确的会话密钥。

6、Change Cipher Spec(不是Handshake Record)

该记录表明Client已做好安全通话的一切准备(意味着它可以计算出会话密钥了)。我们可以阅读该记录,Client在说,它做好准备去更改由Client和Server所指定的密码。

7、Handshake:Finished

  • 向Server证明:Client有正确的会话密钥

  • 这会由特定的值(Encrypted Verification)来完成,过程如下

    • Client计算出之前所有握手记录(5个)的哈希,这5个记录会一起被哈希,生成Handshake Hash
    • 然后,Handshake Hash会与其他值("client finish"字符串和Master Secret)相结合来生成验证数据(Verification Data)
    • 最终,验证数据会被Client Session Keys加密,生成加密验证
      • Server用自己的Client会话密钥副本进行验证
      • 验证Client和Server"看见"相同的握手记录
  • 理论上,Server也看见了之前5个握手记录(即Handshake Hash),"client finished"字符串,同时Server也有Mater Secret,这表明Server能合并得到相同的Verification Data;之后,Server收到加密验证后,用Client Session Key副本去进行解密,如果得到的结果和Server自己合并得到的验证数据相同,这就向Server表明,Client拥有相同的会话密钥。如果有人在Client发送出Client Hello后,Server接受到之前,进行篡改,两边的Verification Data会不匹配

8、Change Cipher Spec(不是Handshake Record)

该记录表明Server已做好安全通话的一切准备(意味着它可以计算出会话密钥了)

9、Handshake:Finished

  • 向Client证明:Server有正确的会话密钥
  • 类似的过程
    • Client计算出之前所有握手记录(6个)的哈希,得到Handshake Hash
    • Handshake Hash会与其他值("server finish"字符串和Master Secret)相结合来生成验证数据(Verification Data)
    • 验证数据会被Server Session Keys加密,生成加密验证
      • Client用自己的Server会话密钥副本进行验证

在此刻的握手中,Client和Server都计算出相同的会话密钥,并且相互向对方证明自己有正确的会话密钥。这意味着两者可以开始分享批量数据了,并用协商好的会话密钥保护该数据。

以上就是TLS握手(我们阐述的是basic handshake)的全部过程

需要知道的是,TLS握手发生在我们每次访问HTTPS网站的时候,或者每次我们链接SSL VPN(Virtual Private Network)的时候

参考文献

1、网站:https://www.practicalnetworking.net/:practical TLS

相关推荐
XMYX-013 小时前
解决 Apache/WAF SSL 证书链不完整导致的 PKIX path building failed 问题
网络协议·apache·ssl
少陽君2 天前
什么是CA根证书
服务器·https·ssl
梦想blog2 天前
漏洞修复 Nginx TLSSSL 弱密码套件
运维·nginx·ssl·漏洞修复·tlsv1.2
yong15858553432 天前
利用 openssl api 实现 TLS 双向认证
linux·ssl
XYiFfang3 天前
【Python+requests】解决Python requests中的ProxyError:SSL版本错误问题详解
python·debug·ssl·常见错误·代理配置
Linux运维技术栈5 天前
Linux系统部署:Certbot 实现 Nginx 自动续期&部署 Let‘s Encrypt 免费 SSL 证书
linux·运维·nginx·ssl·certbot
m0_474606787 天前
Nginx + Certbot配置 HTTPS / SSL 证书(简化版已测试)
nginx·https·ssl
神色自若9 天前
AbpVnext 阿里云ssl证书多个生产环境自动更新
服务器·阿里云·ssl
bkspiderx9 天前
安全扫描:目标主机支持RSA密钥交换问题
网络·nginx·安全·tls·rsa·弱算法
码农康康10 天前
【国密证书】CentOS 7 安装 GmSSL 并生成国密证书
linux·ssl·国密·国密证书