支付安全基础 —— HTTPS的故事
本文主要讲述了HTTPS的基本原理,通过HTTPS握手过程、证书链、中间人攻击、CA机构等问题,详细解释了百付宝系统中用到的HTTPS安全知识,同时,介绍了如何查看www.baifubao.com的线上证书及其含义。最后藉由查看证书,来屏蔽不安全证书带来的潜在风险。
1. HTTPS概述
HTTPS并不是一个单独的协议,而是对工作在一加密连接(SSL/TLS)上的常规HTTP协议。通过在TCP和HTTP之间加入TLS(Transport Layer Security)来加密.
(注: TLS为新版本的SSL)
2. 为何需要HTTPS?
不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文传播,带来了三大风险。
SSL/TLS协议是为了解决这三大风险而设计的。那么SSL/TLS如何解决这三大风险呢?
2.1 所有信息都是加密传播,第三方无法窃听
HTTPS一般使用的加密与HASH算法如下:
这里就要比较对称加密和非对称加密了。
- 对称加密:
- 非对称加密:
2.2 具有校验机制,一旦被篡改,通信双方会立刻发现
2.3 配备数字证书,防止身份被冒充
数字证书是一个文件。此文件保存了加密过的用户的信息及公钥。对于百度钱包而言,数字证书就包含经过CA认证(使用CA的私钥加密)的域名(www.baifubao.com)以及公钥等信息。
数字证书在HTTPS的什么时候会用上呢?这里就要提到HTTPS握手。
3. HTTPS握手过程
通过上述的握手过程可以直到,非对称密钥只是用来加密传输对称密钥的。因为可以保证传输中的对称密钥在传输的过程中无法被破解。所以握手之后的内容通信就是安全的。
握手过程中涉及到两种证书:
为何需要可信的根证书呢?这就需要提到中间人攻击
4. 中间人攻击
假设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的抓取就是靠中间人攻击的方式。打开Fiddler ,Tools->Fiddler options->HTTPS中的https capture,那么fidder会提示你安装一个fiddler自己生成的根证书(fiddler自己作为CA)名为DO_NOT_TRUST_FIDDLER_ROOT的根证书。如图:
之后当浏览器访问的每个https的域名(如www.baifubao.com等):
浏览器收到fiddler作为server端返回的https回应时:
CA机构到底是什么呢?
5. CA,证书链,根证书
5.1 数字证书认证机构(CA)
- 它的出现就是为了防止中间人攻击的。
- 防止中间人攻击,说白了就是要确保B收到的A的公钥(证书)真实有效,这样数字证书认证机构应运而生。
- 数字证书认证机构说白了就相当于一个受信任的中间人。CA有一对根密钥,其公钥称为根证书。
5.2 数字证书从何而来
5.2.1 对于根证书(ROOT CA)和中间证书(Intermediate CA)
- 在用户的操作系统(或者浏览器)中,会集成世界范围内所有被信任的CA的根证书。
- 安装软件时顺带安装,如支付宝安全控件等,此时软件会请求管理员权限(流氓...)。
- 用户自己下载安装,如12306网站
5.2.2 对于用户证书
比如www.baifubao.com的证书,是百付宝公司通过如versign之类相关认证机构去资质审核以及缴费获得的。那么https访问中,server发来的数字证书长啥样呢?
5.3 百度钱包www.baifubao.com的证书
点击浏览器导航栏左上角的小锁
www.baifubao.com证书路径中有三层,表示三级证书链。那么什么是证书链呢?
5.4 证书链
CA证书分为两类:根证书(Root CA)和中间证书(Intermediate CA)。但是根证书的使用是收到严格限制的,不可能对于每一类用户都使用根证书去签发子数字证书,所以就有了中间证书的概念。
中间证书由根证书或上一级中间证书签发,它可以再往下级签发数字证书。
例如我们自己为某个域名申请了证书 My CA,那么对于三级证书链,它的签发过程如下:
上面讲到的签发关系很像链式结构,所以被称作证书链。
验证的过程可想而知,就是签发的逆过程,这是通过证书链来完成的:
所以说,对于刚才www.baifubao.com的3级证书链来说,根证书(ROOT CA)是Versign Class3 Public xxxx . 中间证书(Intermediate CA)是Versign Class3 International xxxx
那么如何查看自己安装的根证书呢?
5.5 如何查看已经安装的数字证书
5.6 有风险的根证书
没错,我发现自己的根证书列表中竟然有支付宝的alipay,这证书是啥时候跑进来的?
alipay原本没有versign的待遇的,但是自从你装了支付宝安全控件之后,他就自己插进来了,太危险了。事实上把alipay相关的根证书删掉依然是可以正常使用支付宝的,因为alipay有versign认证的证书。
再次重复一句,整个HTTPS通信的唯一核心保障就是可信的根证书。这种自己安装不可信的根证书会有遭到中间人攻击的风险。
5.7 为何就不能安装看起来靠谱的根证书呢?
导入ROOTCA的危险性:
如果导入支付宝,铁道部12306.cn这种第三方CA的根证书,将会大大增加受到中间人攻击的可能性。如果支付宝私钥泄露,所有支付宝用户都有遭到中间人攻击的可能性。
而铁道部的根证书更危险,铁道部的私钥必然对官方是公开的,GFW完全有能力通过铁道部的私钥来实现对所有导入了铁道部CA根证书的用户的中间人攻击,让你的HTTPS加密流量完全暴露给GFW。正确的做法是,不导入根证书,访问12306购票时候,无视证书警告,点仍然继续,依然可以正常购票.
不止如此,安装个支付宝控件,你会发现多了一个OSCCA的ROOTCA,然后你查找OSCCA,结果是:国家商用密码办公室...
如果GFW之类的代理服务器想要窃听你的https内容,就会像Fiddler一样,向所有你访问的域名颁发一个用户证书,用这个证书来和浏览器通信,从而达到窃听目的。
劝大家,运行certmgr.msc,把奇怪的证书都清理干净吧。添加根证书的行为就是给自己留下非常危险的后门。