最近有同事问关于HTTPS连接建立的过程,前段时间看过不少别人的解读,现在把自己的一点理解写下来,请大家多指教交流.
首先先明确一下HTTPS使用的加密方式有两种:
1.非对称加密 (客户端和服务器相互验证过程中使用).
2.对称加密(客户端和服务器验证通过之后,以随机数作为密钥时(真正的通信时)使用)
过程:
1.客户端发起加密请求,叫做client hello,客户端主要提供的信息有:
(1)客户端可以使用的SSL/TLS版本
(2)客户端支持的加密方式
(3)客户端生成的随机数(用于生成对话密钥)
(4)服务器名称
2.服务器收到客户端的一系列消息后发出响应(server hello),回应的内容主要包括:
(1)确认加密通信版本如果与客户端支持的版本不一致则服务器关闭加密通信
(2)从客户端支持的加密方式中选择一种作为加密方式
(3)服务器生成的随机数(用于生成对话密钥)
(4)服务器证书(证书内容:证书颁发机构,网站域名,证书公钥,证书签名)
除了上边这些信息,如果服务器需要确认客户端身份,就会再包含一项请求,要求客户端提供客户端证书(使用场景:服务器只允许指定的客户端连接)
3.客户端收到服务器响应后首先需要验证服务器证书:
客户端验证证书内容的有效性,过期时间,域名等
由于客户端预置了CA机构的根证书,里面包含CA公钥,通过本地根证书的CA公钥,解密数字摘要,看看是否匹配
4.客户端验证证书没问题然后发送下面信息:
(1)一个随机数(pre-masterSecret)用第三步取出的公钥加密,并发送给服务器
此时共产生3组随机数,客户端和服务器用商定的加密方法对三个随机数进行处理生成对话需要使用的对称密钥也就是会话密钥
(2)客户端发送通知,告诉服务器将使用双方商定的加密方法和密钥发送
(3)客户端发送finished消息,表示客户端握手阶段已经结束,这个finished消息就是对上述客户端与服务器发送所有内容的一个hash值,并用会话密钥进行加密,用来验证客户端失败不是刚刚建立信任的客户端。
服务器在收到客户端发送的finished消息后,将对消息进行验证,服务器对之前所有的消息也做一个hash,并对客户端发送过来的消息通过会话密钥进行解密然后将两个消息进行对比,如果一样则证明发送消息的客户端是之前简历起信任的客户端
5.服务器最后响应:
(1)服务器发送通知,告诉可互动将使用双方商定的加密方法和密钥发送
接下来就是4步骤的(3)