聊聊HTTPS与Android安全(二)

“互联网仍然处于开端的开端阶段(the beginning of its beginning)”《失控》——凯文.凯利

聊聊HTTPS与Android安全(二)_第1张图片

中间人攻击

中间人攻击(Man-in-the-MiddleAttack,简称“MITM攻击”)是一种“间接”的入侵攻击

聊聊HTTPS与Android安全(二)_第2张图片

 假设A是服务器,B是用户,B向A发起HTTPS连接,于是A需要将自己的公钥发给B。中间人C通过某种手段可以截获并伪造AB之间的通讯(比如GFW或者共享wifi等)。

 那么C可以伪造一份A的公钥,并保有这分假公钥的私钥;然后截获A发给B的真公钥,并伪造自己的身份,让B认为自己就是A,并把伪造的公钥发给B;

 如此一来,B会通过伪造的公钥给A发送密文,而C就可以截获这些密文并利用手中的私钥轻易的解密这些密文了;

 然后将这些密文通过正确的公钥转发给服务器A,这样AB之间的通讯仍将继续,AB在毫不知情的情况下被中间人把证书“偷梁换柱”,从而达成了中间人攻击,AB之间的非对称加密形同虚设,从而TLS协议的对称加密的密钥就能被C轻易的获取。

 如此,TLS完全告破。

总结:如果你安装了 中间人(代理服务器)自己生成的根证书,那么就中招了。

举个例子:

    Fiddler对https的抓取就是靠中间人攻击的方式。

聊聊HTTPS与Android安全(二)_第3张图片

打开Fiddler ,Tools->Fiddler options->HTTPS中的https capture,那么fidder会提示你安装一个fiddler自己生成的根证书(fiddler自己作为CA)名为DO_NOT_TRUST_FIDDLER_ROOT的根证书。

聊聊HTTPS与Android安全(二)_第4张图片

之后当浏览器访问的每个https的域名(如www.baidu.com等):

fiddler会作为客户端先解开https内容

使用自己作为CA(名为DO_NOT_TRUST_FIDDLER_ROOT)的私钥,对baidu这个域名颁发一个用户证书。

https握手时向浏览器发送这个用户证书

浏览器收到fiddler作为server端返回的https回应时:

聊聊HTTPS与Android安全(二)_第5张图片

 尝试解开server发来的用户证书,由于已经安装了fiddler的根证书,因此可以解开。

 其中的域名是baidu.com,同浏览器访问的域名一致,因此证书这一部分就验证成功了。接下来的握手就自然可以完成。

 那么,CA机构到底是什么呢?

CA,证书链,根证书

数字证书认证机构(CA)

  • 它的出现就是为了防止中间人攻击的。
  • 防止中间人攻击,说白了就是要确保B收到的A的公钥(证书)真实有效,这样数字证书认证机构应运而生。
  • 数字证书认证机构说白了就相当于一个受信任的中间人。CA有一对根密钥,其公钥称为根证书。

    A向CA申请一个证书,则CA利用其私钥加密A的公钥,其结果就是“服务器A,通过CA验证的证书”。
    
    而在用户的操作系统(或者浏览器)中,会集成世界范围内所有被信任的CA的根证书。
    
    这样,用户B在收到A发送给他的证书后,需要利用CA的根证书(公钥)解密后才能得到正确的公钥,如此一来,就完成了对A发送过来的信息的验证,证明了A的正身,不是C伪造的假证书,从而达成了中间人攻击的防范。
    

数字证书从何而来

对于根证书(ROOT CA)和中间证书(Intermediate CA)

  • 在用户的操作系统(或者浏览器)中,会集成世界范围内所有被信任的CA的根证书。
  • 安装软件时顺带安装,如支付宝安全控件等,此时软件会请求管理员权限(流氓…)。
  • 用户自己下载安装,如12306网站

对于用户证书
比如www.alipay.com的证书,是支付宝公司通过如versign之类相关认证机构去资质审核以及缴费获得的。那么https访问中,server发来的数字证书长啥样呢?

支付宝www.alipay.com的证书
点击浏览器导航栏左上角的小锁
聊聊HTTPS与Android安全(二)_第6张图片
聊聊HTTPS与Android安全(二)_第7张图片
聊聊HTTPS与Android安全(二)_第8张图片

www.alipay.com证书路径中有三层,表示三级证书链。那么什么是证书链呢?

证书链

CA证书分为两类:

  1. 根证书(Root CA)
  2. 中间证书(Intermediate CA)。

 但是根证书的使用是收到严格限制的,不可能对于每一类用户都使用根证书去签发子数字证书,所以就有了中间证书的概念。

 中间证书由根证书或上一级中间证书签发,它可以再往下级签发数字证书。

 例如我们自己为某个域名申请了证书 My CA,那么对于三级证书链,它的签发过程如下:

    Root CA 签发 Intermediate CA, Intermediate CA 签发 My CA这时我们就可以用My CA去给域名作数字认证了。

 上面讲到的签发关系很像链式结构,所以被称作证书链。

 验证的过程可想而知,就是签发的逆过程,这是通过证书链来完成的:

 - 浏览器会在计算机以及浏览器的证书列表中查找此CA是否可信, 如果有则认为My CA是可信的;
 - 如果没有,继续往上找,直到根证书:
 - 如果根证书是可信的,那么整条证书链就是可信的;
 - 如果根证书不可信,那么My CA将被认作是不可信的,浏览器就会发出警告。

所以说,对于刚才www.alipay.com的3级证书链来说:

  • 根证书(ROOT CA)是Versign Class3 Public xxxx
  • 中间证书(Intermediate CA)是 Symantec Class 3 Secure Server xxxx

如何查看已经安装的数字证书

  • 对于windows平台:win+R, 输入certmgr.msc
  • 对于Ubuntu: 放在/usr/share/ca-certificates/中

有风险的根证书

聊聊HTTPS与Android安全(二)_第9张图片

 查看了自己电脑的证书,发现很多根证书都不知道从何而来的,(估计是其他插件捆绑安装来的)

 整个HTTPS通信的唯一核心保障就是可信的根证书。这种自己安装不可信的根证书会有遭到中间人攻击的风险。

/*
* @author zhoushengtao(周圣韬)
* @since 2015年7月3日 11:04:22
* @weixin stchou_zst
* @blog http://blog.csdn.net/yzzst
* @交流学习QQ群:341989536
* @私人QQ:445914891
/
聊聊HTTPS与Android安全(二)_第10张图片

你可能感兴趣的:(android,https)