https建立连接的过程(文字版)

245 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情

今天继续没空写长文,就依然还是写点基础小文,本篇是关于https的,详细介绍了https的连接过程。应该是你没看过的船新版本,因为一般讲https都是讲基于RSA的,实际上RSA的已经不推荐使用了,详情看下面具体的描述吧

https在http的基础上增加了ssl/tls(sslv3改名成tls,目前最新tls1.3)

建立连接的过程

基于ECDHE的连接过程

  1. 三次握手建立tcp连接(如果是http,建立完连接后就可以发送报文了)

  2. tls握手(以现在最流行的ECDHE为例,总共四次握手)

//////////////// Client -> ////////////////////

(1)客户端发送client hello到服务端,同时带上tls版本号,客户端支持的安全套件和客户端随机数(client_random)

///////////////// <- Server ///////////////////

(2)服务端收到后,选出一个双方都支持的加密套件,发送server hello到客户端,同时带上tls版本号,加密套件,服务端随机数(server_random)

(3)服务端发送自己的证书到客户端(Server Certificate

(4)服务端发送Server Key Exchange到客户端,带上秘钥交换的算法的参数(Server Params),里面有椭圆曲线的公钥等

(5)服务端发送server hello done

///////////////// 以上的过程是一次往返

(6)客户端验证服务端发过来的证书(证书链),具体就是验证证书的颁发机构,机构,是否吊销,是否已过期等,然后从浏览器或者操作系统内置的对应根证书中拿出公钥去验签,得到一个hash,再将证书内容也计算出另一个hash做对比,这一步的目的是校验服务器身份。

///////////////// Client -> ////////////////////

(7)客户端发送Client Key Change到客户端,带上椭圆曲线的公钥(Client Params

(8)客户端发送Change Ciper Spec,告诉服务端切换成对称机密

(9)客户端用椭圆曲线的公钥(Server Params)计算出pre-master-key(预主秘钥) Server Params ^ b % P = pre-master-key,再用client_randomserver_randompre-master-key作为伪随机数函数的参数计算出master-key,作为最终的对称加密秘钥

(10)客户端对上面往返的所有握手数据计算出摘要,用master-key加密后,发送finshed信息带给服务端(这一步是让服务端确认能不能正确解密)

到这里第三次握手完成,就已经可以发送报文了 (false start)

///////////////// <- Server ///////////////////

(11)服务端发送Change Ciper Spec

(12)服务端发送Finished,计算所有握手数据的摘要,计算出master-key加密数据,发送到客户端

基于RSA的链接过程

如果使用的是传统的握手(RSA握手),区别是pre-master-key不是计算出来的,而是客户端生成然后发送到服务端的

//////////////// Client -> ////////////////////

(1)客户端发送client hello到服务端,同时带上tls版本号,客户端支持的安全套件和客户端随机数(client_random)

///////////////// <- Server ///////////////////

(2)服务端收到后,选出一个双方都支持的加密套件,发送server hello到客户端,同时带上tls版本号,加密套件,服务端随机数(server_random)

(3)服务端发送自己的证书到客户端(Server Certificate

(4)服务端发送server hello done

///////////////// 以上是一次往返

(5)客户端验证服务端发过来的证书(证书链),具体就是验证证书的颁发机构,机构,是否吊销,是否已过期等,然后从浏览器或者操作系统内置的对应根证书中拿出公钥去验签,得到一个hash,再将证书内容也计算出另一个hash做对比,这一步的目的是校验服务器身份。

///////////////// Client -> ////////////////////

(7)客户端发送Client Key Change,随机生成一个pre-master-key,用刚刚证书里的公钥加密后发送给服务端

(8)客户端发送Change Ciper Spec,告诉服务端切换成对称机密

(9)客户端用用client_randomserver_randompre-master-key作为伪随机数函数的参数计算出master-key,作为最终的对称加密秘钥

(10)客户端对上面往返的所有握手数据计算出摘要,用master-key加密后,发送finshed信息带给服务端(这一步是让服务端确认能不能正确解密)

到这里第三次握手完成,就已经可以发送报文了 (false start)

///////////////// <- Server ///////////////////

(11)服务端发送Change Ciper Spec

(12)服务端发送Finished,计算所有握手数据的摘要,计算出master-key加密数据,发送到客户端