携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情
今天继续没空写长文,就依然还是写点基础小文,本篇是关于https
的,详细介绍了https
的连接过程。应该是你没看过的船新版本,因为一般讲https
都是讲基于RSA
的,实际上RSA
的已经不推荐使用了,详情看下面具体的描述吧
https在http的基础上增加了ssl/tls(sslv3改名成tls,目前最新tls1.3)
建立连接的过程
基于ECDHE的连接过程
-
三次握手建立tcp连接(如果是http,建立完连接后就可以发送报文了)
-
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_random
,server_random
,pre-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_random
,server_random
,pre-master-key
作为伪随机数函数的参数计算出master-key
,作为最终的对称加密秘钥
(10)客户端对上面往返的所有握手数据计算出摘要,用master-key
加密后,发送finshed信息带给服务端(这一步是让服务端确认能不能正确解密)
到这里第三次握手完成,就已经可以发送报文了 (false start)
///////////////// <- Server ///////////////////
(11)服务端发送Change Ciper Spec
(12)服务端发送Finished,计算所有握手数据的摘要,计算出master-key
加密数据,发送到客户端