26 | 信任始于握手:TLS1.2连接过程解析
TLS的几种子协议及结构
一个TLS报文由若干记录层(Record Layer)组成。记录层相当于是一个消息容器,承载其它协议,它包括一个TVL,描述其承载的其它协议。
如上图,这是一个Server Hello消息,一条TLS报文,包含了4条TLS handshake Protocol。
警报协议(Alert Protocol)
握手协议(Handshake Protocol), type=22,wireshark 中过滤条件设置为 tls.record.content_type22或tls.handshake.typex 对应的子handshake包括
name |
type |
Client Hello |
1 |
Server Hello |
2 |
Certificate |
11 |
Server Key Exchange |
12 |
Server Hello Done |
14 |
Client Key Exchange |
16 |
New Session Ticket |
4 |
Finished |
20 |
变更密码规范协议(Change Cipher Spec Protocol),type=20,length=1,切换密文通讯的指示,wireshark过滤条件tls.change_cipher_spec。
TLS false start
即TLS建立连接的过程未结束,客户端即可发送HTTP请求
如上图,在Client Key Exchange之后和服务端Change Cipher Spec之前,就可以发送数据。
TLS1.2连接建立示意图
TLS1.2连接建立过程将交换两次消息:
第一组消息:
客户端
Client Hello
+TLS Version #版本号,注Chrome Client Hello填的版本号是TLS1.0
+Random #客户端随机数C
+Cipher suite #列出客户端支持的加密套件
Client Hello的报文结构
TVL
TLV
Random
Session Length
Session ID
Cipher Suit Length
Cipher Suits
Compression Methods Length
Compression Methods
Extensions Length
Extensions: xxx
……
下面是一个真实的TLS1.2的Client Hello
TLSv1.2 Record Layer: Handshake Protocol: Client Hello
Content Type: Handshake (22)
Version: TLS 1.0 (0x0301)
Length: 512
Handshake Protocol: Client Hello
Handshake Type: Client Hello (1)
Length: 508
Version: TLS 1.2 (0x0303)
Random: 1cbf803321fd2623408dfe70d825c9dbdab33fd273f6a884a44e59347bcbd421
Session ID Length: 32
Session ID: f655c8005ba1a4f66cd8790cac2c3847344ff3fad2629d64761f471fac84a35f
Cipher Suites Length: 34
Cipher Suites (17 suites)
Compression Methods Length: 1
Compression Methods (1 method)
Extensions Length: 401
Extension: Reserved (GREASE) (len=0)
Extension: server_name (len=19)
Extension: extended_master_secret (len=0)
Extension: renegotiation_info (len=1)
Extension: supported_groups (len=10)
Extension: ec_point_formats (len=2)
Extension: session_ticket (len=0)
Extension: application_layer_protocol_negotiation (len=14)
Extension: status_request (len=5)
Extension: signature_algorithms (len=20)
Extension: signed_certificate_timestamp (len=0)
Extension: key_share (len=43)
Extension: psk_key_exchange_modes (len=2)
Extension: supported_versions (len=11)
Extension: compress_certificate (len=3)
Extension: Reserved (GREASE) (len=1)
Extension: padding (len=202)
服务端
Server Hello
+TLS Version #确认版本号
+Random #服务端随机数S
+Cipher suite #从客户端支持的加密套件中选择一个套件 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,因为本例选择的秘钥交换算法是ECDHE,所以消息中会包括Server Key Exchange
Certificate
Server Key Exchange
包括公钥,曲线,哈希签名算法和签名,#注这个签名是针对Server Key Exchange而不是针对公钥,并且使用的私钥,哈希算法都是本次会话临时生成的,和证书中的公钥没有关系。
Server Hello Done
Server Hello消息虽然叫Server Hello,但其实包括了4个TLS记录,分别是
Server Hello
Certificate
Server Key Exchange
Server Hello Done
Server Hello记录结构
TVL
TLV
Random
Session Length
Session ID
Cipher Suits #服务器选择的加密套件
Compression Methods
Extensions Length
Extensions: xxx
经过第一轮2个TCP报文,客户端,服务端共享了3个信息,C,S, Server Key Params
客户端还拿到了Certificate
下一步客户端需要验证收到的Certificate
第二组消息
客户端
客户端验证了Certificate后发出Client Key Exchange消息,类似的,它是一个TCP报文,包括3个TLS记录
Client Key Exchange
仅包括公钥,#不包括曲线和签名算法可以理解,因为已收到并将使用和服务端相同的曲线和签名算法?
#为什么不包括签名?因为结束会做一个消息整体的加密?
Change Cipher Spec Protocol #客户端切换到加密协议
Finished #把客户端所有发送过的握手协议消息摘要再加密发送给服务器,验证解密功能。【会话秘钥?】
服务端
Change Cipher Spec Protocol #服务端切换为加密协议
Finished #把服务端所有发送过的握手协议消息摘要在加密发送给服务器,验证解密功能。
第二轮消息交换完毕
客户端,服务端各自拿到了Client/Server Params,据此算出pre-master
再根据C,S, pre-master算出master,再根据master扩展出客户端/服务器端会话秘钥
至此ECDHE方式的TLS过程结束。
RSA握手方式
RSA的TLS握手过程类似,主要是pre-master的获得方式不同,RSA中没有Server Key Exchange过程,直接由客户端生成一个随机数作为pre-master,并用服务端的公钥加密,以Client Key Exchange记录的方式发给服务端,服务端私钥解密获得这个随机数。
后继和ECDHE方式一样,也是用C,S,pre-master算出master
双向验证
抓包招行u盾,抓不到和双向验证的任何记录。。。
理论上,服务端在Server Hello Done要发Certificate Request,客户端端要随后发Client Certificate
课后作业:
密码套件里的那些算法分别在握手过程中起了什么作用?
以TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384为例
ECDHE 对称秘钥交换,并根据交换的公钥算出pre-master
RSA 提供数字证书的公钥和私钥,并用私钥加密证书摘要。
AES_256_GCM 对称加密
SHA384 辅助生成对称秘钥;生成秘钥的PRF使用安全套件中指定的摘要算法;证书明文摘要。
你能完整地描述一下 RSA 的握手过程吗?
Client Hello with C,suits,ver
Server Hello with S, suit,ver
Certificate[Server]
Server Hello Done
Client Key Exchange
RSA public key crypt pre-master
Change Cipher spec[client]
finished
Change Cipher spec[server]
finished
你能画出双向认证的流程图吗?
Client Hello
- Server Hello
- Server Certificate
- Server key exchange
- Certificate Request
- Server Hello Done
Client Certificate
Client key exchange
Change Cipher spec
finished
- Change Cipher spec
- finished