
文章插图
ECDHE 握手过程刚才你看到的是握手过程的简要图,又画了一个详细图,下面我就用这个图来仔细剖析 TLS 的握手过程 。

文章插图
在 TCP 建立连接之后,浏览器会首先发一个“Client Hello”消息,也就是跟服务器“打招呼” 。里面有客户端的版本号、支持的密码套件,还有一个随机数(Client Random),用于后续生成会话密钥 。

文章插图
Handshake Protocol: Client HelloVersion: TLS 1.2 (0x0303)Random: 1cbf803321fd2623408dfe…Cipher Suites (17 suites)Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)
文章插图
这个的意思就是:“我这边有这些这些信息,你看看哪些是能用的,关键的随机数可得留着 。”?复制代码
作为“礼尚往来”,服务器收到“Client Hello”后,会返回一个“Server Hello”消息 。把版本号对一下,也给出一个随机数(Server Random),然后从客户端的列表里选一个作为本次通信使用的密码套件,在这里它选择了“TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384” 。
Handshake Protocol: Server HelloVersion: TLS 1.2 (0x0303)Random: 0e6320f21bae50842e96…Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)这个的意思就是:“版本号对上了,可以加密,你的密码套件挺多,我选一个最合适的吧,用椭圆曲线加 RSA、AES、SHA384 。我也给你一个随机数,你也得留着 。”?复制代码然后,服务器为了证明自己的身份,就把证书也发给了客户端(Server Certificate) 。
接下来是一个关键的操作,因为服务器选择了 ECDHE 算法,所以它会在证书后发送“Server Key Exchange”消息,里面是椭圆曲线的公钥(Server Params),用来实现密钥交换算法,再加上自己的私钥签名认证 。

文章插图
Handshake Protocol: Server Key ExchangeEC Diffie-Hellman Server ParamsCurve Type: named_curve (0x03)Named Curve: x25519 (0x001d)Pubkey: 3b39deaf00217894e...Signature Algorithm: rsa_pkcs1_sha512 (0x0601)Signature: 37141adac38ea4...
文章插图
这相当于说:“刚才我选的密码套件有点复杂,所以再给你个算法的参数,和刚才的随机数一样有用,别丢了 。为了防止别人冒充,我又盖了个章 。”?复制代码
之后是“Server Hello Done”消息,服务器说:“我的信息就是这些,打招呼完毕 。”
这样第一个消息往返就结束了(两个 TCP 包),结果是客户端和服务器通过明文共享了三个信息:Client Random、Server Random 和 Server Params 。
客户端这时也拿到了服务器的证书,那这个证书是不是真实有效的呢?
这就要用到第 25 讲里的知识了,开始走证书链逐级验证,确认证书的真实性,再用证书公钥验证签名,就确认了服务器的身份:“刚才跟我打招呼的不是骗子,可以接着往下走 。”
然后,客户端按照密码套件的要求,也生成一个椭圆曲线的公钥(Client Params),用“Client Key Exchange”消息发给服务器 。
Handshake Protocol: Client Key ExchangeEC Diffie-Hellman Client ParamsPubkey: 8c674d0e08dc27b5eaa…现在客户端和服务器手里都拿到了密钥交换算法的两个参数(Client Params、Server Params),就用 ECDHE 算法一阵算,算出了一个新的东西,叫“Pre-Master”,其实也是一个随机数 。?至于具体的计算原理和过程,因为太复杂就不细说了,但算法可以保证即使黑客截获了之前的参数,也是绝对算不出这个随机数的 。
现在客户端和服务器手里有了三个随机数:Client Random、Server Random 和 Pre-Master 。用这三个作为原始材料,就可以生成用于加密会 话的主密钥,叫“Master Secret” 。而黑客因为拿不到“Pre-Master”,所以也就得不到主密钥 。
为什么非得这么麻烦,非要三个随机数呢?
这就必须说 TLS 的设计者考虑得非常周到了,他们不信任客户端或服务器伪随机数的可靠性,为了保证真正的“完全随机”“不可预测”,把三个不可靠的随机数混合起来,那么“随机”的程度就非常高了,足够让黑客难以猜测 。
推荐阅读
- 详解 gcc 编译、链接原理—揭开应用程序运行背后的奥秘
- JAVA中常见的阻塞队列详解
- 支付宝app支付服务端的实现-Java版
- 白条体验版多久升级 京东白条体验版额度不会升了吗
- 有限状态机 多图详解TCP三次握手和四次挥手
- 玛卡泡茶有副作用吗,西双版纳有哪些茶区
- 华强北顶配airpods2与正品对比 华强北二代airpods和原版对比
- .NET 5.0 正式版发布:应用可在ARM64设备上原生运行
- 一文详解操作系统进程管理
- 谈恋爱的技巧的方法详解
