1.客户端发起https请求
2.服务端响应一个证书(包含服务器信息,公钥,数字签名---证书颁发机构,证书的指纹(证书颁发机构自己用私钥加密的)和指纹算法等)
3.客户端验证证书是否安全.判断内容
(1)判断颁发机构是否为操作系统所信任的(一般在本地) --------操作系统会默认一些颁发机构是安全的
(2)利用操作系统所信任的颁发机构的证书 (这里的证书是颁发机构自己用的) 中的公钥,去解密上述证书的加密的指纹得到指纹hash摘要
(3)利用上述指纹算法算出指纹hash摘要,从而对比两个hash摘要是否相同,从而保证证书数据没有被篡改过
4.如果第3步都验证通过说明该证书是可信的
5.检验服务器响应证书的公钥,是否为服务器所发
6.给服务器发送随机字符串,服务器用私钥加密随机字符串并做hash摘要响应给客户端,客户端用公钥解密得到hash摘要并和自己生成的hash值对比是否一致,从而判断对方是否为服务器
7.如果第6步通过,说明服务端确实拥有正确的私钥,客户端就可以用这个公钥加密一个对称加密的密钥(简称对称密钥)然后发送给服务端
8.服务端用私钥解密这个加密的对称密钥,以后双方便用这个对称密钥加密进行通信。
上述存在的疑问的个人见解
(2)利用操作系统所信任的颁发机构的证书 (这里的证书是颁发机构自己用的) 中的公钥,去解密上述证书的加密的指纹得到指纹hash摘要
这一步的指纹hash摘要的意义是什么?不做hash摘要会不会有影响?
答:因为证书中的(公钥)对应了一个私钥,而这个私钥只有证书机构才拥有。
不做hash的情况,黑客只要篡改证书信息,很难模拟对应的私钥加密生成的指纹,而该指纹如果不做hash摘要,那么我们验证也不做hash摘要保持一致就可以了。所以可以不是必须的。
这里做hash的意义,可以减小数据长度,加快到时对方用公钥解密速度,优化性能。
第6步同理,hash可以优化性能,且此处这样使用可以让黑客更难找出加密规律(因为是主动探查服务端有没有私钥)。