1. HTTPS 主要解决中间人攻击 防止被劫持
HTTPS正是要解决这个问题,在HTTP传输层之上加了一个安全层(SSL或TLS协议实现),做到点:
- 数据的保密性
- 校验双方身份的真实性
- 数据的完整性
标题 | |
---|---|
保密 | 加密算法 |
检验双方身份 | HTTPS使用了 数字证书,数字证书就是身份认证机构(Certificate Authority)盖在数字身份证上的一个章或印(或者说加在数字身份证上的一个签名),这一行为表示身份认证机构已认定这个人。证书的合法性可以向CA验证。 |
完整性 | 哈希算法能够将任意长度的字符串转化为固定长度的字符串,该过程不可逆,可用来作数据完整性校验。 |
校验双方身份的真实性?
HTTPS使用了 数字证书,数字证书就是身份认证机构(Certificate Authority)盖在数字身份证上的一个章或印(或者说加在数字身份证上的一个签名),这一行为表示身份认证机构已认定这个人。证书的合法性可以向CA验证。
数据完整性
服务器在发送报文之前做了3件的事:
- 用哈希算法对报文提取定长摘要
- 用私钥对摘要进行加密,作为数字签名
- 将数字签名附加到报文末尾发送给客户端
客户端接收到报文后:
- 用公钥对服务器的数字签名进行解密
- 用同样的算法重新计算出报文的数字签名
- 比较解密后的签名与自己计算的签名是否一致,如果不一致,说明数据被篡改过。
HTTPS通信的大致过程
客户端将自己支持的加密算法发送给服务器,请求服务器证书; 服务器选取一组加密算法,并将证书返回给客户端; 客户端校验证书合法性,生成随机对称密钥,用公钥加密后发送给服务器; 服务器用私钥解密出对称密钥,返回一个响应,HTTPS连接建立完成; 随后双方通过这个对称密钥进行安全的数据通信。
为什么Charles能够抓取HTTPS报文?
Charles作为一个 中间人代理,当浏览器和服务器通信时,Charles接收服务器的证书,但动态生成一张证书发送给浏览器,也就是说Charles作为中间代理在浏览器和服务器之间通信,所以通信的数据可以被Charles拦截并解密。由于Charles更改了证书,浏览器校验不通过会给出安全警告,必须安装Charles的证书后才能进行正常访问。
下面来看具体的流程:
客户端向服务器发起HTTPS请求 Charles拦截客户端的请求,伪装成客户端向服务器进行请求 服务器向“客户端”(实际上是Charles)返回服务器的CA证书 Charles拦截服务器的响应,获取服务器证书公钥,然后自己制作一张证书,将服务器证书替换后发送给客户端。(这一步,Charles拿到了服务器证书的公钥) 客户端接收到“服务器”(实际上是Charles)的证书后,生成一个对称密钥,用Charles的公钥加密,发送给“服务器”(Charles) Charles拦截客户端的响应,用自己的私钥解密对称密钥,然后用服务器证书公钥加密,发送给服务器。(这一步,Charles拿到了对称密钥) 服务器用自己的私钥解密对称密钥,向“客户端”(Charles)发送响应 Charles拦截服务器的响应,替换成自己的证书后发送给客户端 至此,连接建立,Charles拿到了 服务器证书的公钥 和 客户端与服务器协商的对称密钥,之后就可以解密或者修改加密的报文了。