浏览器读取证书的数字签名部分,用自身根证书列表中对应的公钥证书对其进行解密。如果解密成功,并且证书哈希值与签名内的哈希值匹配一致,可证明站点提供的证书确实是该CA根证书签发的,否则给出风险提示。
验证通过之后,使用证书中的公钥对随机数和对称加密算法加密,发送给服务端,服务端用私钥进行解密,获得密钥和加密算法。
服务端与浏览器后续通信将会使用新的对称加密算法和随机密钥加密信息。
证书在整个流程起到了重要的作用,那么能不能通过窃取和伪造的方式来获取通信内容呢?
窃取。首先证书当然是可以被窃取的,因为它是公开的,但是拿到了证书后也只能和服务端进行通信,不能用来窃取其它信息,至于证书的私钥存储在服务端,更加不可能随意被窃取了。
伪造。如果有人伪造了一张网站证书,那么浏览器在向CA查询证书信息的时候就会验证失败。
那这么说就是绝对安全了吗?非也~
对于DNS劫持的情况还是无解的。比如浏览器访问网站的时候给了一个假证书,然后向CA验证证书的时候又访问了一个假网站,证书就有可能被验证通过。从而黑客可以作为中间方获取并转发双方的数据。
总结SSL证书从生成到使用涉及到了三次加解密过程:
证书生成的时候利用私钥签名,验证证书的时候利用公钥解密。
确认证书有效后,利用证书中的公钥进行加密,服务端利用私钥解密。
双方使用新生成的随机密钥进行数据加解密。
用一张结构图表示下HTTPS和X.509的关系:
HTTPS / \ HTTP TLS/SSL / \ 通信内容 确认身份 对称加密 SSL证书 —— X.509 格式,非对称加密