为什么https是安全的

原文链接:http://www.yka365.com/mid-admin/topic/index/4

https的安全性体现在两方面。一方面是客户端与服务端通信过程中数据是加密的,这样即便数据被截获也没关系,因为截获者看不懂啊。另一方面由于有证书验证机制做背书,客户端可以完全信任服务端,不必担心服务端是黑客网站或钓鱼网站。下面具体介绍这两方面的原理。

一、https的加密原理

1、非对称加密

非对称加密有公钥和私钥这两把钥匙,公钥可以随便发给别人,私钥一定要自己保存好。公钥加密的数据只有私钥能解密,而私钥加密的数据也只有公钥才能解密。客户端发信息给服务端时,先用拿到的公钥加密数据,这样数据在网络中传输时即使被截获,由于没有私钥,所以也没办法解密。这样看起来很完美,服务器自己保留私钥,把公钥发布给各个客户端。但是由于非对称加密性能很差,每次加解密都耗费cpu资源,怎么优化呢?

2、对称加密

对称加密性能比非对称加密好很多而且比较简单,通信前客户端和服务端协商一个随机口令,然后用对称加密算法(随机口令作为加密算法的一个输入参数)对传输的数据进行加密。这样在网络中传输的数据也是安全的,但是问题是怎么保证协商的随机口令的传输安全?于是https结合了二者的优点,将加密分成了两步。第一步用非对称加密方式把随机口令安全递交给客户端,然后后续的数据传输都用对称加密。

二、证书的原理

1、证书的权威性

证书没有很高大上,谁都可以制作,就如同各种电影节都可以颁发最佳影片,关键是权威性问题。证书也是一样,只有权威机构颁发的证书浏览器才认。否则浏览器会弹出类似下图的警告:

2、证书的信任链

证书还存在一个信任链,当你信任了证书C,那么由证书C颁发的证书你也会无条件信任,以此类推如下图

在我们操作系统中已经内置了权威机构的证书,而像百度、淘宝等知名网站,其证书都是由这些权威机构颁发的,所以当我们访问这些网站时就不会有上面第一张图中的警告信息。

3、抓包工具Fiddler、Charles的抓包原理

Fiddler和Charles的抓包原理是一样的,很简单,就是一个代理的角色。我们用Fiddler举例,比如当你访问百度时,浏览器先把请求数据发给Fiddler,然后再由Fiddler转发到百度。而数据返回时也是先经过Fiddler,再由Fiddler转给浏览器。所以站在浏览器的角度看,Fiddler就是服务器,而站在服务器的角度看,Fiddler就是浏览器。但这里有个问题,当发送https请求时是需要证书的,证书怎么来?我们以浏览器访问百度(https://www.baidu.com)为例进行分析。

第一步浏览器将请求发送到Fiddler(此时Fiddler的角色是服务器),既然发的是https请求那么浏览器就要求对方提供证书,于是Fiddler就给浏览器颁发一个证书,这里就碰到我们上面说的问题,Fiddler并不是权威机构,浏览器怎么才能信任它颁发的证书呢?这里要强调一下,当要抓取https的数据包前,我们要先安装Fiddler的根证书,该证书可以从Fiddler中导出。安装完成也就相对于告诉操作系统,我们信任此根证书,那么由它颁发的证书我们都信任;

第二步Fiddler发请求到百度服务器端(此时Fiddler的角色是客户端浏览器),此过程没什么特别的,就和浏览器直接访问百度一样;

三、常见问题

1、如何验证服务器发送过来的证书的有效性?

答、步骤如下:

1、浏览器收到服务器发送过来的证书后,遍历操作系统中内置的CA,找到颁发机构与之匹配的CA;
2、浏览器取出CA中的公钥,使用公钥对证书的签名进行解密;
3、将解密的结果与证书指纹做对比,如果对比一致则说明证书是真的;
4、浏览器提取出证书中的公钥,以便后续使用;



你可能感兴趣的:(为什么https是安全的)