Client------->Server
Client Hello
Client Hello
Version:客户端的最新版本
Random:客户端生成的随机数(明文,将会作为会话密钥的一部分)
Cipher Suites:客户端支持的密码套件(供服务端进行选择)
Server------->Client
Server Hello,Certificate,Server Key Exchange,Server Hello Done
Server Hello
Version:服务端的最新版本
Random:服务端生成的随机数(明文,将会作为会话密钥的一部分)
Cipher Suites:服务端选择的密码套件
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
ECDHE:密钥协商算法
- HTTPS中有两种常用的密钥交换算法:RSA/ECDHE,现在常用ECDHE,原因一为ECDHE较难破解,原因二为在使用ECDHE时用到的是临时密钥,如果当前密钥被破解了,损失也会较小,对于RSA来说密钥一段时间内不更改,一旦被破解,损失较大,即RSA不具备前向安全。
对于后续的第三个随机数(会话秘钥主要会用到三个随机数,第一个随机数是明文,是客户端发给服务端的,第二个随机数是明文,是服务端发给客户端的,第三个随机数是密文,是客户端发给服务端的),RSA和ECDHE将会有以下区别:
RSA:此时服务端已经将公钥发给客户端,客户端产生第三个随机数,并用服务端发来的公钥进行加密,发给服务端后,让服务端用其私钥进行解密,这样双方就同时有第三个随机数。
ECDHE:服务端和客户端同时约定一个公共参数,双方分别形成各自的公钥和私钥,互换公钥,将自己的私钥和对方的公钥按照公式形成相同的第三个随机数。
RSA:签名算法(Server Key Exchange中会用到)
- 选择椭圆曲线+互换公钥+计算私钥---后面将详细说明
AES:握手后的通信算法
128:密钥长度(会话秘钥)
GCM:分组模式
SHA256:摘要算法
Certificate
Server端向Client端提供的Server证书
Server Key Exchange(选择ECDHE特有的步骤)
Named Curve+Pubkey:服务端选择了椭圆曲线的类型以及名称,此时也选好了G点(公共参数),服务端生成随机数作为自己的私钥,并根据G点计算服务端的公钥,发送给客户端
Signature Algorithm:服务端用RSA算法给服务端公钥做签名,将服务端公钥记作消息m
- 签名:服务端计算m的消息摘要,即为h(m);并且,服务端对消息h(m)用自己的私钥进行加密得到s,将m和s传给客户端
- 验签:客户端计算m的消息摘要,记为h'(m);用收到的服务端的公钥“解密”s得到H(m),并将h'(m)和H(m)进行比对
Server Hello Done
Server端向Client端发送的消息结束
Client------->Server
Client Key Exchange,Change Cipher SPec,Encrypted Handshake Message
验证服务端的证书是否可信(Server端证书需要CA机构来验证,CA拥有自己的公钥和私钥,CA先用自己的私钥对Server端公钥与其他信息进行签名,操作系统中有关于CA公钥的信息,Client端会用CA公钥对Server端公钥及其他信息进行验签)
Client Key Exchange
对应着Server Key Exchange,客户端生成自己的公钥和私钥,将公钥传给服务端,私钥自己保存,此时双方可以用自己的私钥和对方的公钥来用公式计算出相同的第三个伪随机数,与前两个随机数一起形成会话秘钥
Change Cipher SPec
告知Server端后续采用对称加密算法(AES)
Encrypted Handshake Message
将前面的握手信息生成摘要,再用双方都有的会话密钥进行加密,传递给服务端,如果服务端可以解密且与之前的握手信息对应,则密钥一致
Server------->Client
Change Cipher Spec,Encrypted Handshake Message
同理