HTTPS之TLS1.2连接详解

x33g5p2x  于10个月前 转载在 其他  
字(2.5k)|赞(0)|评价(0)|浏览(100)

本文说一下HTTPS的会话连接详情,HTTPS连接除了正常的TCP三次连接,还引入了TLS连接。

本文说的是基于

1、三次握手连接

首先通过三次握手连接来建立连接

接下来就是TLS连接

2、TLS第一次握手 ——ClientHello

客户端首先明文发送以下信息,用于建立加密连接
1、随机数ClientRandom
客户端生成一个随机数ClientRandom ,用于后面合成 密钥

2、TLS版本号
客户端支持的TLS版本号

3、加密套件列表
客户端支持的加密算法列表

套件包括以下信息:
摘要算法: 签名中的压缩算法
密钥生成算法: 用于生成密钥
对称加密算法: 后续传输数据用什么算法进行对称加密
非对称加密算法: 传输密钥的时候用什么非对称加密算法

3、TLS第二次握手

服务器收到客户端发送的ClientHello,然后发送回应信息到客户端,分为以下三个包

1、ServerHello

ServerHello中包括以下信息
1、确认TLS版本号
确认客户端发送的TLS版本号,如果不支持客户端对应的TLS版本,就中断连接。

2、随机数ServerRandom
服务器也随机生成一个随机数ServerRandom,用于后面合成密钥

3、加密套件
服务器从客户端中发来的加密算法列表中选择一个套件作为加密套件

2、Certifacte

返回服务器的CA证书,客户端从CA证书中获取公钥

3、Server Key Exchange

TLS中的密钥生成非常复杂,不是简单的由客户端生成一个随机数,而是利用ECDHE 算法生成一个对称密钥,然后在和客户端生成的一个随机数、服务器生成的一个随机数合成一个更随机的密钥。

ECDHE算法可以根据两组公钥和私钥来生成一个对称密钥,假设由两组公钥和私钥,公钥1和私钥1是配对的,公钥2和私钥2是配对的。

密钥的生成流程如下:
1、制定参数,两组公钥和私钥共用一组参数
2、一个随机数作为私钥,每组都随机生成一个数作为私钥
3、根据私钥+参数 生成一个公钥,比如利用私钥1生成公钥1.
4、利用私钥1和公钥2经过运算得到一把密钥,利用私钥2和公钥1经过运算得到一把密钥,这两把密钥是一模一样的。

没错,两组公钥和私钥就分别对应着客户端和服务器。

服务器制定好参数,然后随机生成一个私钥1,然后利用规则生成一个公钥1。

服务器将 公钥1和参数包装为Server Param发送给客户端,这个过程叫做Server Key Change

Server Param会通过数字签名技术来保证黑客无法篡改服务器发送的公钥1。通过服务器之前的私钥(不是私钥1,而是CA证书对应的私钥)进行加密,由于之前客户端已经从CA证书中获取了对应的公钥,客户端是可以顺利解析出公钥1的。

通过参数和公钥是无法破解出私钥的,私钥就存放在本地,不会在网络中传输

ServerHelloDone
服务器发送ServerHelloDone,说明服务器已经将TLS需要的所有信息都发送给客户端了。

TLS第三次握手

客户端会从CA证书中获取到服务器对应的公钥,如果获取公钥失败,就说明CA证书被篡改了,就会终止连接。

接着生成一个随机数作为私钥2,利用私钥2和Server发过来的公钥1生成一个随机数 pre-master,同时利用ClientRandom、ServerRandom、pre-master这三个数生成了密钥。这就是之后 客户端和服务器之间进行对称加密的密钥。

ClientKeyExchange
利用服务器发过来的参数和私钥2,生成一个公钥2。然后将公钥2发送给服务器,这样叫做Client Key Exchange

客户端接着会发送一个Change Cipher Spec,表示客户端开始使用密文进行传输了。

然后发送一个Finished,里面记载着客户端在TLS握手期间向服务器发送的所有数据做一个摘要,服务器收到后,也会将服务器之前收到的数据也做一个摘要,比对是否一致,如果一致,说明TLS连接正常,没有被黑客篡改。

在TLS第三次握手后,客户端就可以开始发送密文数据了。

TLS四次握手

服务器在收到公钥2后,也会通过参数和私钥1生成一个密钥pre-master,然后根据ClientRandom、ServerRandom、pre-master这三个数生成最终的密钥。

然后也发送一个Change Cipher Spec,表示服务器也开始使用密文进行传输。

最后发送一个Finished,里面记载着服务器向客户端发送过的数据的摘要,客户端收到后,也会把之前接收服务器的数据做一个摘要,比对两者,如果一致,就说明连接安全,如果不一致,就说明数据被黑客篡改了。

为什么这么费劲的使用ECDHE算法来生成密钥呢?

1、如果由客户端随机生成一个密钥,是容易被黑客猜测到的,所以引入了ECDHE,来进一步增强随机性。
2、ECDHE比RSA具有前向安全,因为一旦服务器密钥泄露,黑客手机了之前的密钥传输数据,就能解密之前的连接对应密钥。如果该连接还在运行,数据就会泄露。并且之后的连接也会被泄露。
ECDHE每次都随机一个私钥,并且不适用服务器私钥来生成密钥,安全性高的狠。

RSA 和 ECDHE的区别

1、RSA的做法是客户端直接生成随机数,然后通过公钥传输给服务器就行了。少了ECDHE的密钥、ServerRandom、Client的等数据的传输过程。

2、ECDHE客户端在第三次握手就可以发送数据了,而RSA客户端需要四次握手后才能发送数据

3、ECDHE 比 RSA更安全。

如果服务器的私钥被泄露,那么RSA中的密钥传输到服务器的时候,黑客是可以将其解密出来的。

而ECDHE即使服务器的私钥泄露,也不会造成密钥泄露,因为密钥是由ECDHE的私钥控制生成的,并且ECDHE的私钥是随机生成的,实在太tm安全了

Finished校验的必要性

Finished校验是非常有必要的,如果不校验的话,不论是RSA传输pre-master的时候,还是ECDHE传输ClientRandom、ServerRandom、以及客户端的公钥2的时候,都有可能被篡改。

导致客户端和服务器对应的密钥不一致,虽然不会泄露数据,但是数据是不能正常解密的。

相关文章