上一篇文章中我说到:HTTPS是不安全的,因为存在MIM攻击。但是随着了解的深入,发现这个认识是有问题的,正确的认识应当是:HTTPS的设计是安全的,只是错误的用法导致了MIM攻击

关于SSL/TLS协议运行机制,阮一峰的博客文章做了很好的介绍。

稍加了解,可以发现,其实上一篇文章中的设计就是参照了SSL/TLS协议运行机制,混合了非对称加密和对称加密,有几点需要注意:

  1. 引入了证书机制来确保服务端下发的公钥不被窜改。
  2. 引入三组随机数组成最后的随机数,保证了随机数的随机性。

相比于一个正常的HTTPS通信过程,MIM攻击下的HTTPS通信过程如下(这里以Charles为例): 第一步,客户端发送给服务器的HTTPS请求,**Charles截获后伪装成客户端向服务器发送请求进行握手 **。 第二步,服务器发回相应,Charles获取到服务器的CA证书和其中包含的证书公钥。然后Charles伪造自己的CA证书, 冒充服务器证书传递给客户端。 第三步,客户端校验接收到的证书,生成密码pre_master并用接收到的证书中包含的公钥加密,并生成HTTPS通信用的对称密钥enc_key。 第四步,客户端将加密后的pre_master传递给服务器, Charles截获后将密文用自己伪造证书的私钥解开, 获得pre_master并计算得到HTTPS通信用的对称密钥enc_key,伪装成客户端,用服务端证书中携带的公钥加密pre_master向服务器发送。 第五步,服务器用私钥解开后建立信任。

成功建立”信任“之后,由于Charles持有通信用对称密钥enc_key,无论是客户端的请求密文或者是服务端的返回密文,对其都是可见的。

以上攻击发生的前提,就是客户端信任由Charles下发的证书,从而接受证书中包含的公钥信息

为了防御MIM攻击,只需客户端只信任CA颁发的证书即可,当然要求服务端的证书也是由CA颁发,这就意味着一笔高昂的费用( 购买受信任机构颁发的证书每年要交 100 到 500 美元不等的费用)。 除了CA颁发的证书,还有两类证书:

  • 没有得到CA认可的证书颁发机构颁发的证书
  • 自己颁发的证书, 分临时性的(在开发阶段使用)或在发布的产品中永久性使用的两种

所以很多产品,为了方便和实惠,采用了自签名证书来创建HTTPS链接。 而自签名证书的使用过程中可能因为存在下列问题而导致受到MIM攻击:

  1. 客户端没有对SSL证书进行校验(因为自建证书的根CA的数字签名未在操作系统的信任列表中,如果添加校验肯定会返回失败);
  2. 客户端没有对域名进行校验;
  3. 服务端遭受攻击,证书私钥泄漏。

所以MIM中间人攻击漏洞并不是HTTPS设计的缺陷,而是人为使用过程中出现的漏洞

相比之下,一个设计的比较好的APP在MIM攻击中则表现为:

所以,在采用HTTPS给接口加固的时候,一定切记要在客户端校验服务端证书的合法性。 不论证书是由CA颁发,或者是自签名证书(自签名证书校验方法参见这篇文章)。