面试常见问题:https的工作流程
最近看了介绍https的很多博客,好些都不太完整,在此做个总结,力图展示清楚https握手过程的全貌。若写得有误,还请指正;觉得写得不错,还请不吝点赞收藏~
https简介
我们知道http是明文传输的数据,存在着敏感数据被截获等风险。于是https应运而生。
简单来说,https=http+ssl/tls,即加密的http
ssl(Secure Socket Layer,安全套接字层)和tls(Transport Layer Security)都是用来加密的协议,可简单理解为加密算法不同
需提前掌握的概念
对称加密、非对称加密、公钥、私钥:
数字证书、摘要、数字签名(不清楚的请参考https://zhuanlan.zhihu.com/p/32754315)
https的握手过程(简易版)
参考自https://www.cnblogs.com/fengfengyang/p/9852481.html
-
客户端提交https请求
-
服务器响应客户,并把服务器公钥发给客户端
-
客户端验证公钥的有效性
-
有效后,客户端会生成一个会话**(一个随机数)
-
用服务器公钥加密这个会话**后,发送给服务器
-
服务器收到公钥加密的**后,用私钥解密,获取会话**
-
客户端与服务器利用会话**对传输数据进行对称加密通信
客户端如何检验公钥是不是合法呢?
客户端拿着服务器发来的公钥再发请求去CA那做检验?
并不是。客户端其实需要预置CA签发的根证书,这个根证书中保存了CA的公钥。
而且在之前的第2步中,服务器发的并不是服务器公钥,而是由CA签发的服务器证书,这个证书包括了两部分:用CA私钥对服务器公钥以及其他网站信息加密后得到的的密文+对服务器公钥hash后的摘要。
服务器将证书发给客户端以后,客户端从CA根证书中获取CA公钥,对服务器证书的密文进行解密,得到服务器公钥(当然还有网站的其他信息,这里先忽略),然后再hash一次公钥,比较得到的结果和证书携带的摘要是否一致。
过程如下图所示:
服务器证书的摘要
其实,服务器证书携带服务器公钥等信息(还包括域名、域名持有者、证书失效时间、证书签发时间等信息)的明文和这些信息hash后的摘要都是安全的。
假如服务器证书携带的是服务器公钥等信息的明文,客户端在解密密文得到服务器公钥等信息后,直接和证书携带的明文信息比较,也能判断明文信息是否被修改过。
因此,证书携带摘要而不是公钥等信息的明文目的在于:减少发送的数据量,从而减少数据发送时间