03.HTTPS协议及用Fiddler查看HTTPS流量

96
OliverGao
0.1 2016.06.29 15:08* 字数 4814

本文部分内容参考果壳网对HTTPS的介绍,这里是原文链接:http://www.guokr.com/post/114121/

什么是HTTPS协议?

HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。

SSL是Netscape公司所提出的安全保密协议,在浏览器(如Internet Explorer、Netscape Navigator)和Web服务器(如Netscape的Netscape Enterprise Server、ColdFusion Server等等)之间构造安全通道来进行数据传输,SSL运行在TCP/IP层之上、应用层之下,为应用程序提供加密数据通道,它采用了RC4、MD5 以及RSA等加密算法,使用40 位的密钥,适用于商业信息的加密。同时,Netscape公司相应开发了HTTPS协议并内置于其浏览器中,HTTPS实际上就是SSL over HTTP,它使用默认端口443,而不是像HTTP那样使用端口80来和TCP/IP进行通信。HTTPS协议使用SSL在发送方把原始数据进行加密,然 后在接受方进行解密,加密和解密需要发送方和接受方通过交换共知的密钥来实现,因此,所传送的数据不容易被网络黑客截获和解密。

SSL目前的版本是3.0,被IETF(Internet Engineering Task Force)定义在RFC 6101中,之后IETF对SSL 3.0进行了升级,于是出现了TLS(Transport Layer Security) 1.0,定义在RFC2246。实际上我们现在的HTTPS都是用的TLS协议,但是由于SSL出现的时间比较早,并且依旧被现在浏览器所支持,因此SSL依然是HTTPS的代名词,但无论是TLS还是SSL都是上个世纪的事情,SSL最后一个版本是3.0,今后TLS将会继承SSL优良血统继续为我们进行加密服务。目前TLS的版本是1.2,定义在RFC5246中,暂时还没有被广泛的使用。

HTTPS的工作原理

HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL中使用了非对称加密,对称加密以及HASH算法。关于非对称加密,对称加密涉及密码学相关知识,我们简单了解一下。

先看的是对称加密,所谓的对称加密,加密解密用的是同样的“钥匙。用邮局的例子来解释下对称加密,Alice 在盒子里放有信息,盒子上有挂锁,她有钥匙。通过邮局她把这个盒子寄给Bob。Bob收到盒子后,用相同的钥匙打开盒子(钥匙之前就得到了,可能是Alice面对面给他的)。然后Bob可以用同样的方法回复。


然后看非对称加密,非对称加密的加密解密用的是不同的“钥匙”。还是用Bob和Alice举例子:Bob和Alice各有自己的盒子。Alice要跟Bob秘密通信,她先让Bob把开着的盒子通过邮局发给她。Alice拿到盒子后放入信息锁上,然后发给Bob。Bob就可以用他自己的钥匙打开了。回复的话就用同样的方法。


HTTPS握手过程的简单描述如下:

  • 浏览器将自己支持的一套加密规则发送给网站。
  • 网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
  • 获得网站证书之后浏览器要做以下工作:
    • 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
    • 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。
    • 使用约定好的HASH计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。
  • 网站接收浏览器发来的数据之后要做以下的操作:
    • 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。
    • 使用密码加密一段握手消息,发送给浏览器。
  • 浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。

SSL证书怎么来的?

SSL证书可以向CA机构通过付费的方式申请,也可以自己制作。CA机构颁发的证书价格非常昂贵,而且有效期一般只有一年到三年不等(年数不同,价格也不同),过期之后还要再次交钱申请,因此一般只有企业才会申请证书。但是随着个人网站的增多,目前也有针对个人的SSL证书服务,价格相对便宜一些,国内的话400多块钱就能申请到一个,国外更是有免费的SSL证书可以申请。

在申请SSL证书时需要向CA机构提供网站域名,营业执照,以及申请人的身份信息等。网站的域名非常重要,申请人必须证明自己对域名有所有权,如果支持Hotmail.com,Gmail.com的SSL证书都可以随便申请,黑客们就不用做假证书欺骗了。此外,一个证书一般只绑定一个域名,如果CA机构心情好的话,会免费再绑一个,比如你要申请域名时绑定的域名是guokr.com,那么只有在浏览器地址是https://guokr.com的时候,这个证书才是受信任的,如果地址是https://www.guokr.com或者https://login.guokr.com,那么这个证书由于访问的域名与证书绑定的域名不同,仍然会被浏览器显示为不受信任的。CA机构也提供申请通配符域名(例如,*.guokr.com),通配符域名相当于绑定了主域名下的所有域名,因此使用起来非常方便,但是价格也超级昂贵,一个通配符域名一年大概得5000块钱,只有企业才可以申请。下面就来看看一个证书的信息:


在访问hotmail的时候会跳转到login.live.com,这时IE浏览器上会有一个小锁头,点一下那个小锁头再点击里面的“查看证书”就会出现上图的证书窗口,这里面我们可以看到这个证书只有一个用途——向远程计算机证明身份信息,证书的用途会有很多,SSL只是其中之一。在“颁发给”这一项就是这个证书在申请时绑定的域名;下面的“颁发者”是证书的颁发机构。最下面的两个日期是证书申请时间以及过期的时间。这里我们可以注意一下“颁发者”的信息,里面有“Extended Validation SSL”的字样,表明了这个证书是一个EV SSL证书(扩展验证SSL证书),EV SSL证书有个特点就是可以让浏览器的地址栏变绿,同时显示出来证书所属公司的名称。EV SSL证书与其他的证书相比,费用更高。

以上说的是向CA机构申请证书的情况,如果个人网站只为加密传输也可以自己制作SSL证书,自己制作的证书不会受到浏览器的信任,在访问的时候由于证书验证失败而给出警告。

证书以证书链的形式组织,在颁发证书的时候首先要有根CA机构颁发的根证书,再由根CA机构颁发一个中级CA机构的证书,最后由中级CA机构颁发具体的SSL证书。我们可以这样理解,根CA机构就是一个公司,根证书就是他的身份凭证,每个公司由不同的部门来颁发不同用途的证书,这些不同的部门就是中级CA机构,这些中级CA机构使用中级证书作为自己的身份凭证,其中有一个部门是专门颁发SSL证书,当把根证书,中级证书,以及最后申请的SSL证书连在一起就形成了证书链,也称为证书路径。在验证证书的时候,浏览器会调用系统的证书管理器接口对证书路径中的所有证书一级一级的进行验证,只有路径中所有的证书都是受信的,整个验证的结果才是受信。我们还是以login.live.com这个证书举例,在查看证书的时候,点击“证书路径”标签就会有下图的显示:


根证书是最关键的一个证书,如果根证书不受信任,它下面颁发的所有证书都不受信任。操作系统在安装过程中会默认安装一些受信任的CA机构的根证书,可以在“运行”里面运行“certmgr.msc”启动证书管理器查看相关证书。

SSL证书验证失败有以下三点原因:

  • SSL证书不是由受信任的CA机构颁发的
  • 证书过期
  • 访问的网站域名与证书绑定的域名不一致
    这也是我们在访问有些网站时浏览器会弹出提示提示我们的信息。

所以在访问HTTPS网站时需要注意如下的问题:

  • 除非必要,不要随意安装根证书。安装根证书的时候一定要明确证书的来源。当然这里有个网站要特别说明:对于12306.cn,一定要按照网站说的那样,“为保障您顺畅购票,请下载安装根证书”。
  • 对于网银,在线支付,重要邮箱等网站,一定要确保SSL证书是没有问题的,如果浏览器给出SSL证书错误的警告,一定要拒绝访问。一些小区宽带用户一定要注意这点。
  • 由于现在个人申请SSL证书比较便宜,一定要注意挂着合法SSL证书的钓鱼网站(国外比较常见)。对于钓鱼网站,一定要看清域名,另外别相信什么中奖的消息,同时要安装带有钓鱼防护功能的安全软件。

Fiddler抓HTTPS包的相关设置

介绍了这么多的HTTPS/SSL协议相关的内容之后我们要回到我们的正题Fiddler工具上了,今天的主题是使用Fiddler查看HTTPS流量,那么为什么要查看HTTPS流量呢?这个问题和为什么要使用Fiddler工具其实是一致的,我们使用Fiddler工具是为了查看、调试网络流量,但是如果不做设置,我们的Fiddler是无法查看到HTTPS包的相关内容的。为了安全方面的考虑,许多的应用在传递敏感信息的时候会选用HTTPS协议来传输已确保数据的安全性(杀毒软件和手机防护软件也会检查应用在传递敏感信息是是否使用了加密手段作为对该软件安全评级的一个因素),当我们需要查看这些流量时就必须要开启Fiddler的HTTPS debug功能了。

在Fiddler菜单中选择Toos->Fiddler Options,打开HTTPS TAB:


  • 勾选Capture HTTPS CONNECTS,会抓取CONNECT请求,CONNECT请求是HTTP协议中的请求方法中的一种(还有GET,POST,HEADER,PUSH等方法),其作用是建立一个直接通往目标服务器的TCP通道用于数据的传输,大多数http proxy支持CONNECT命令,但一般只支持CONNECT到外部服务器的443(https)端口。这是为了允许访问外部的https服务。porxy对于CONNECT的连接是直接转发,不做任何分析处理或缓存。客户端访问HTTPS请求会先向服务器发送一个CONNECT请求,建立与服务器通信的通道,后续的HTTPS内容的传输也会在这个通道内传输,开启这个选项我们便能看到CONNECT请求了,在Fiddler中,它通常是这样的:


  • 然后勾选Decrypt HTTPS traffic选项,这时就开启的了Fiddler抓取HTTPS包的功能,同时会自动安装Fiddler根证书,根证书的作用我们上面已经详述了,Fiddler具体怎么样破解HTTPS流量的我们稍后详谈,我们先把这选项看完,点击后会弹出对话框让用户确认,点击Yes:



    然后Windows会询问用户是否信任安装的证书,选择是:



    此时PC上的Fiddler证书已经安装完成,可以查看HTTPS流量了。
  • Ignore server certificate errors选项可选可不选,作用是如果勾选了在服务器证书真的是不可靠的时候会报错提醒,如果是debug自己的产品在ssl证书是自己构造的时候是可以勾上这个选项避免告警的

至此我们已经完成了Fiddler查看HTTPS报文的操作,是不是很简单呢?那么为什么Fiddler能够查看到HTTPS报文内部的内容呢?知乎上有一篇答案回复的比较详细,我们一起来看一下,原文链接,答主:连山归藏

首先fiddler截获客户端浏览器发送给服务器的https请求, 此时还未建立握手。
第一步, fiddler向服务器发送请求进行握手, 获取到服务器的CA证书, 用根证书公钥进行解密, 验证服务器数据签名, 获取到服务器CA证书公钥。
第二步, fiddler伪造自己的CA证书, 冒充服务器证书传递给客户端浏览器, 客户端浏览器做跟fiddler一样的事。
第三步, 客户端浏览器生成https通信用的对称密钥, 用fiddler伪造的证书公钥加密后传递给服务器, 被fiddler截获。
第四步, fiddler将截获的密文用自己伪造证书的私钥解开, 获得https通信用的对称密钥。
第五步, fiddler将对称密钥用服务器证书公钥加密传递给服务器, 服务器用私钥解开后建立信任, 握手完成, 用对称密钥加密消息, 开始通信。
第六步, fiddler接收到服务器发送的密文, 用对称密钥解开, 获得服务器发送的明文。再次加密, 发送给客户端浏览器。
第七步, 客户端向服务器发送消息, 用对称密钥加密, 被fidller截获后, 解密获得明文。由于fiddler一直拥有通信用对称密钥, 所以在整个https通信过程中信息对其透明。

简单总结一下就是Fiddler用自己的被用户信任过的根证书与客户端通信,假装自己是服务器,获取到客户端向服务器传递的信息,同时以客户端的姿态以真实的证书向服务器请求数据,再把收到的数据已Fiddler证书加密后传回给客户端,其间所有的数据都是对Fiddler可见的,所以就就能够解析出内容啦。

Android手机抓HTTPS包操作指南

Fiddler要能够查看手机的HTTPS包根据我们前面对Fiddler抓HTTPS包原理的分析,我们需要在手机上安装Fiddler证书即可,在安装Fiddler后,我们的Fiddler会自动在PC机的相应端口(即上一讲中在选项中设置的端口,默认8888)上建立一个网站,访问
http://<PC机IP>:<Fiddler端口号>
可以打开一个网页,这个网页中最下面提供了链接就是Fiddler的证书下载,使用Android任意浏览器访问这个页面,点“FiddlerRoot certificate”:


然后弹出证书安装菜单,随意填写名字:

Android系统为了安全性考虑,安装自定义证书后需要启用锁屏密码,设置一个即可

iPhone手机抓HTTPS包操作指南

IOS操作与Android类似,使用Safari访问地址下载证书:



然后点击安装即可:


HTTPS丢包了怎么办?

使用Fiddler抓HTTPS可能会遇到HTTPS丢包的情况,通常可以通过如下几个方法解决:

  • 查看手机代理是否设置正确
  • 关闭PC机防火墙
  • 重新安装手机证书(最好删除掉所有证书后安装)
  • 重装FiddlerPC端证书(在Fiddler Options中的HTTPS Tab中,去勾选Capture HTTPS CONNECTs,然后点击Remove Interception Certificates,重启Fiddler再按照启用HTTPS抓包的顺序操作一次即可)
  • 重装Fiddler(删除Program Files及我的文档下的Fiddler2文件夹,重装Fiddler,可能是Fiddler有Bug在以上办法都不行时可以试试这个操作,记得备份自己的HOSTS,及自定义脚本插件等文件)
Fiddler
Web note ad 1