HTTP采用明文传输,存在被监听、内容被篡改、身份被冒充的可能。为了保证安全性,须要对数据进行加密,这便有了HTTPS。git
空 | 对称加密 | 非对称加密 |
---|---|---|
特色 | 惟一的密钥 | 一对公钥和私钥 |
优势 | 加密速度快 | 公钥公开,私钥保密,只要私钥不泄露就很安全 |
缺点 | 全部人都拿着同一密钥,一旦泄露,全部相关数据所有都暴露 | 速度慢 |
从上表的对比看出,使用非对称密钥显然更安全,可是加密速度慢。当数据量小的时候还好,数据大时显然存在不足。但是对称加密又不安全,怎么办?最好的办法就是结合它们俩——对数据加密采用对称加密,对对称加密的密钥采用非对称加密。
github
客户端和服务端分别要用对称密钥来加密和解密,那这个对称密钥如何安全的让双方都知道呢?继续用对称密钥显然不行,此时就结合上非对称密钥。
安全
从图中看出,即便有中间人替换了真正的公钥,双方也没法得知,也就是说,双方没法确认对方身份。那若是对此公钥也进行加密呢?那这样仍是会存在中间人攻击,也就是没法加密多少层,只要最外层的公钥须要传输给对方知道,最外层就有可能发生中间人攻击。这时候咱们须要一个能够不须要传输公钥且又很安全的加密方法,此时就须要引入数字证书了(固然,数字证书的做用不单单只是不须要传公钥)。服务器
这里说明下,权威机构CA的公钥不须要传输,由于权威机构CA会和主流的操做系统合做,将它们的公钥内置在系统中,这样客户端收到数字证书后,从证书中找到权威机构CA的信息,而后根据此信息从本地找到此权威机构CA的公钥进行解密便可。加密
为何要用签名这种方式?能够防止如下3种状况:操作系统
- 若是中间人对服务器公钥进行篡改,则客户端在收到后利用CA的公钥进行解密获得摘要,这将服务器信息通过hash后的摘要不一样,则能够认为此证书不可信;
- 若是中间人对公钥进行篡改后,想要制造出假的签名以绕开以上状况,此时中间人没法得到CA的私钥,也就没法对摘要进行加密获得签名;即便强行找一个错的私钥进行加密,客户端收到后没法用CA的公钥进行解密也没用;
- 若是中间人对整个数字证书进行掉包(将中间人的公钥和域名发给CA,拿到中间人的数字证书),客户端收到时仍然能够利用CA公钥进行解密获得摘要,且对服务器信息(公钥、域名)进行hash获得的摘要同样,但证书中的域名与客户端正在访问的域名不同,所以仍然认为此证书不可信。
其实,Charles代理HTTPS的原理就是以上的第二种状况,即中间人Charles对服务器公钥进行篡改,而后利用Charles签证中心的私钥对服务器信息进行加密,传给客户端。不一样的是,此时客户端已经信任了Charles签证中心,因此能够经过Charles签证中心的公钥对签名进行解密。所以,Charles能代理HTTPS的主要缘由就是:客户端安装证书信任了Charles签证中心。.net
参考文章:
https://github.com/youngwind/blog/issues/108
https://blog.csdn.net/winwill2012/article/details/71774469代理