继上篇深入HTTPS系列三(如何通信)后,
该篇主要讲HTTPS中间人攻击。
假设有一个攻击者处于“浏览器”和“网站服务器”的通讯线路之间(比如公共WIFI),它的攻击过程如下:
- 服务器向客户端发送公钥。
- 攻击者截获公钥,保留在自己手上。
然后攻击者自己生成一个【伪造的】公钥,发给客户端。 - 客户端收到伪造的公钥后,生成加密hash值发给服务器。
- 攻击者获得加密hash值,用自己的私钥解密获得真秘钥。
同时生成假的加密hash值,发给服务器。 - 服务器用私钥解密获得假秘钥。
FIddler就是通过这种方式截获HTTPS信息。
上面问题的根源是因为“缺乏身份认证机制”,浏览器无法鉴别自己收到的密钥是不是真的来自于网站服务器。
假如具备某种【可靠的】身份认证机制?
★身份认证的几种方式
*基于共同的私密信息
有个人陌生人突然给你发了一封电子邮件,说他是你的老朋友,那么你怎么确保发邮件的人确实是你的老朋友捏。
你可以用邮件向对方询问一些共同的私密事情。如果对方能够回答出来,那么他很有可能是你的老朋友。
*基于双方信任的公证人
比如有个客人来拜访你,但是你也不知道来的人是不是他,那就看他的身份证即可。这
就是国家公安部信用作为公证人,让陌生人建立某种程度信任关系。
★如何解决 SSL 的身份认证问题——CA 的引入
由于双方通常都是互不相识的,显然不可能采用第一种方式,而只能采用第二种公证人方式。
那么,谁来充当这个公证人?这时候,CA 就华丽地登场啦。
浏览器验证网站发过来的证书。如果发现其中有诈,浏览器会提示“CA 证书安全警告”。
由于有了这一步,就大大降低了(注意:是“大大降低”,而不是“彻底消除”)前面提到的“中间人攻击”的风险。
为啥浏览器能发现 CA 证书是否有问题?
因为正经的 CA 证书,都是来自某个权威的 CA。如果某个 CA 足够权威,那么主流的操作系统(或浏览器)会内置该 CA 的“根证书”。
(比如 Windows 中就内置了几十个权威 CA 的根证书)
因此,浏览器就可以利用系统内置的根证书,来判断网站发过来的 CA 证书是不是某个 CA 颁发的。
此文到此结束!
请关注后续!