上一节中知道大概 HTTPS 是怎么构成的。 SSL (安全套接层)和 TLS(传输层安全) 加上 HTTP。然后也大概演示了 对称加密和非对称加密的优缺点。
其实在服务端和客户端交换秘钥的过程中,也在 握手。所以就不单单只有 TCP 的三次握手。
TLS 中有三个版本的握手分别是 TLS1.0 , TLS1.1, TLS1.2 ,TLS1.3但是由于 TLS1.0 在提案阶段就暴露出一些问题。所以就直接没有继续下去。现在我们常用的是 TLS1.2
TLS1.1(RSA 握手)
TLS1.1 也就是以前说的 RSA握手。首先得明确的是不管是 TSL 1.X除了 TLS 1.0 之外。他们之间的握手全部都是 混合加密的方式。
- 客户端会 发送
client-random(随机数) 和 加密方法列表去服务端请求 - 服务端也会随机一个
server-random和 加密方法 以及CA证书至客户端 - 客户端会根据服务端传递过来的
CA证书去验证。通过则用RSA算法生成一个pre_random。 - 客户端通过
client-random,server-random,pre_random通过伪随机函数函数得到secret - 再将这个
pre_random随机数通过证书的公钥发送给服务端. - 服务端通过 证书的私钥解密 获得一个
pre_random。 然后通过用client-random,server-random,pre_random得到一个secret. - 发送一个
确认信号后开始用 以secret作为对称加密的秘钥

TLS1.2(ECDHE 握手)
ECDHE握手在RSA握手的基础上前两个环节都不变
- 客户端会 发送
client-random(随机数) 和 加密方法列表去服务端请求 - 服务端也会随机一个
server-random和 加密方法 以及CA证书至客户端 - 客户端会根据服务端传递过来的
CA证书去验证。通过则用ECDHE算法生成一个pre_random。ECDHE(client_random, server_random) = per_random) - 客户端通过
client-random,server-random,pre_random通过伪随机函数函数得到secret - 再将这个
pre_random随机数通过证书的公钥发送给服务端. - 服务端通过 证书的私钥解密 获得一个
pre_random。 然后通过用client-random,server-random,pre_random得到一个secret. - 发送一个
确认信号后开始用 以secret作为对称加密的秘钥
两者区别
RSA握手 通过 RSA算法 得到 pre_random
ECDHE握手 通过 ECDHE算法 加上 client-random,server-random,得到 pre_random
ECDHE握手客户端生成秘钥后,在发送确认消息后,可以直接发送 HTTP报文。而RSA握手需要等待 服务端的确认消息后才可以开始。
最主要的:RSA 不具备向前安全性,ECDHE 有
向前安全性
一句话概括:一次破解并不影响历史信息的性质就是向前安全性。
比如在RSA握手的过程中,客户端拿到了服务端的公钥,然后用此公钥加密pre_random给服务端。如果此时有第三方有服务端的私钥,并且截获了之前所有报文的时候,那么它就可以破解这段密文并拿到pre_random、client_random、server_random并根据对应的伪随机函数生成secret,即拿到了最终通信的对称密钥,每一个历史报文都能通过这样的方式进行破解。它就不具有向前安全性。
但是ECDHE在每次握手的时候都会产生一个零时的密钥对(也就是client_params、server_params),即使第三方有了私钥能破解,但是对之前的历史报文并没有影响。它就具有向前安全性。
TSL1.3
- 废除了很多加密算法。其中就包括
RSA算法 - 通过利用会话复用节省了重新生成秘钥的时间