续接上篇《HTTPs握手流程抓包解析》,本篇补充阐述了 TLS 握手协商机制流程细节。
按照惯例,还是先贴上 TLS Handshake Flow,方便对照跟踪整体流程。
在 Client Hello
报文中,客户端告诉服务器自己支持的 TLS Version、Cipher Suites、Compression Methods 和 Extension(server_name,elliptic_curves,ec_point_formats(Elliptic curves point formats),signature_algorithms,ALPN Protocol,Extended Master Secret) 等信息。
服务器收到 Client Hello
后,会结合双方支持的加密基础设施(proposed by the client and supported by the server),给客户端回应 Server Hello
反馈(in response to)选择的 TLS 版本以及密码套件(common Cipher Suite)。
在 Packet 8 Server Hello
中包含 elliptic_curves 和 signature_algorithms 等 Extension,协商出的 Cipher Suite 为 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
。
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 解构如下:
ECDHE_RSA:密钥协商交换算法
rfc4492 & rfc5289 定义了该 CipherSuite 的具体实现。
the long term authenticity is confirmed via the server cert’s RSA signature but the transient keys are derived via ephemeral EC keys (which then generate the symmetric key)
ECDHE-RSA uses Diffie-Hellman on an elliptic curve group while DHE-RSA uses Diffie-Hellman on a modulo-prime group.
AES_128_GCM:传输会话(对称)加解密使用 GCM 模式的 AES-128 算法。
主流加密算法趋势是 AES(128/256),加密模式的趋势是 GCM。
GCM 是一种特殊的称为 AEAD 的加密模式,不需要配合 MAC。
SHA256:消息认证码算法,基于有密钥的加密散列函数,用于创建消息摘要/指纹。
使用安全散列算法2(SHA-2)生成256字节的摘要,确保消息的完整性(没有被篡改)。
关于 Cipher Suites 可参考《TLSPARAMS - Cipher Suites》。
客户端首先要校验服务端下发证书(Certificate
)的合法性(validates the certificate chain):
然后,客户端在接收到 Server Key Exchange
报文后,首先需要使用证书中的公钥对签名进行 RSA 解密并校验散列值。如果解密校验通过,则基于 ECDH[^ECDH] 参数中的 Pubkey(the server’s ephemeral ECDH public key) 通过一定的算法计算出 Pre-Master Secret(resultant shared secret)。
紧接着,客户端将基于 Client Hello、Server Hello 中的 2 个 28 bytes 随机数(Random)和这个 Pre-Master Secret 计算出用于派生后续传输所用对称密钥的种子—— Master Secret(Shared Secret)。
两个 Hello 随机数都是明文透传。
ECDH 参数(EC Diffie-Hellman Server Params)携带了 Signatue,需要 Certificate 中的公钥进行 RSA 解密和 HASH 校验,从而保证整个握手协商的安全性。
Master Secret 作为数据加解密相关的 secret 的 Key Material 的一部分。
Key Material 的计算跟 Master Secret(Key) 的计算类似,只不过计算的次数要多。
Key Material需要计算12次,从而产生12个hash值。产生12个hash之后,紧接着就可以从这个 Key Material 中获取 Session Secret 了。
在收到 Server Hello Done
且客户端已成功协商计算出 Session Secret 之后,客户端向服务器发送 Client Key Exchange
、Change Cipher Spec
和 Encryted Handshake Message
报文 。
ChangeCipherSpec
,表示客户端确认接受 Server Hello 中服务器选定的 Cipher Suite。 Client Key Exchange
,这样服务器也能基于 Server Hello
指定的 Cipher Suite 和 Client Hello、Server Hello 中的 2 个 28 bytes 随机数以及 Client Key Exchange 中的 ECDH 参数最终协商出 Session Secret。 发送 Encryted Handshake Message
,表示客户端基于计算出的会话密钥加密一段数据(verify_data,Finished message),在正式传输应用数据之前对握手协商的会话加解密通道进行验证。
服务器只有确保收到了
Change Cipher Spec
、Client Key Exchange
报文并成功协商出了 Session Secret,才能解密(验证)加密的 Finished message。
服务器在收到客户端的 ChangeCipherSpec
报文后,也回应一个 ChangeCipherSpec
告知客户端确定使用双方都支持确认的 Cipher Suite。
服务端在接收到 Client Key Exchange
报文后,基于 ECDH 参数中的 Pubkey 通过一定的算法计算出 Pre-Master Secret(resultant shared secret)。
然后,服务端再基于 Client Hello、Server Hello 中的 2 个 28 bytes 随机数(Random)和这个 Pre-Master Secret 计算出用于派生后续传输所用对称密钥的种子—— Master Secret(Shared Secret)。
ECDH 参数(EC Diffie-Hellman Client Params)使用 Certificate 中的公钥加密,需要使用对应的私钥解密——只有持有证书的服务器才能解开,确保了交换参数的安全性。
Master Secret 作为数据加解密相关的 secret 的 Key Material 的一部分,最终从 Key Material 中获取用于会话加密的对称密钥 Session Secret(Session Key)。
服务端在接收到客户端发过来的 Encryted Handshake Message
后,若使用 Session Secret 能解密出原始校验数据(verify_data,Finished message),则表明 C->S 方向的加解密通道就绪。
同时,服务器也会给客户端发送一份使用 Session Secret 加密的校验数据报文 Encryted Handshake Message
。若客户端也能正确解密,则表明 S->C 方向的加解密通道就绪。
至此,基于非对称加解密(私钥签名公钥解密,公钥加密私钥解密)和 ECDHE 协商出来的对称会话密钥,已被 C=S 双向通道验证,TLS HandShake 成功。
接下来,双方可以使用协商计算出的 Session Secret 和 ALPN Protocol 来进行应用数据(Application Data)的加密传输。
具体来说,双方以 Session Secret 为对称密钥,使用 AES 对称加密算法对 HTTP Request/Response 报文进行加密传输。
所谓 HTTPs 全称为 Hyper Text Transfer Protocol over Secure Socket Layer,意即 over TLS 的 Secure HTTP。
SSL/TLS协议运行机制的概述
图解SSL/TLS协议
How HTTPS Secures Connections / HTTPS是如何保证连接安全
The First Few Milliseconds of an HTTPS Connection
HTTPS 工作原理和 TCP 握手机制
也许,这样理解HTTPS更容易
一个故事讲完https
百度全站 HTTPS 实践
TLS 协议分析 by 微信后台团队