【转载】HTTPS报文抓包

HTTPS简单来说,就是使用SSL对HTTP报文进行加密传输。
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。
 

一、密文解析方法:

HTTPS报文本身是加密的,wireshark也无法解析。因此需要将HTTPS生成的随机数(premaster-secret)提供给wireshark,wireshark才能正确解读密文。
具体配置方法(WINDOWS):

建立path变量 SSLKEYLOGFILE=c:\ssl.key
重启firefox/chrome,访问https网站会自动生成ssl session key
在wireshark中配置:编辑-首选项-Protocol-SSL-(Pre)-Master-Secret log filename 设置为之前配置的ssl.key文件,即可解密抓到的SSL密文
 

二、准备过程(DNS、TCP与302跳转):

在电脑浏览器输入www.baidu.com,此时请求的是HTTP报文。

2.1 DNS解析:获得baidu网站IP地址

2.2 TCP建立连接:HTTP服务基于TCP连接,根据前述DNS解析结果建立连接。

2.3 HTTP请求与响应:可见,服务器响应了一个302 Moved Temporarily 重定向报文,定向到 https://www.baidu.com,接下来进入HTTPS报文请求环节。

扫描二维码关注公众号,回复: 9826312 查看本文章

三、SSL/TLS报文交互(即HTTPS如何通过非对称算法得到一个对称密钥用于加密)

注:此处发生了一次乱序,导致了一次SACK确认,181与180行的先后顺序颠倒了。

下图为TLS/SSL报文交互流程示意图。

      Client                                               Server

         ClientHello
        (empty SessionTicket extension)-------->
                                                         ServerHello
                                     (empty SessionTicket extension)
                                                        Certificate*
                                                  ServerKeyExchange*
                                                 CertificateRequest*
                                      <--------      ServerHelloDone
         Certificate*
         ClientKeyExchange
         CertificateVerify*
         [ChangeCipherSpec]
         Finished                     -------->
                                                    NewSessionTicket
                                                  [ChangeCipherSpec]
                                      <--------             Finished
         Application Data             <------->     Application Data

其中ServerKeyExchange为DH算法专有(RSA算法则无)



175报文:用户端发起Client Hello,携带版本信息与random数(客户端),并在Cipher Suites中提供了所有可用的加密协议。
由于之前未建立过连接,携带length为0的Session id,表明期待一个SessionTicket


179,181报文:服务器端答复Server Hello,选定加密协议(本次抓包为ECDH),并传递自己的certificate给客户端。

以baidu为例:其证书中最重要的两部分内容就是公钥与数字签名。其中数字签名,即确保该certificate为真百度网站所提供的证书。公钥,则用于与百度网址进行RSA不对称算法的数据交互,生成可靠密钥。


180: 服务器端发送Server Key Exchange与Server Hello Done

Server Key Exchange发送了DH算法中的Kb值,并使用RSA签名方式进行了签名确保身份。(如果使用RSA则无此报文)。
Server Hello Done则表明Server端的报文已结束。

至此,Server已经提供了证书、公钥、Kb,并发送Hello Done进行确认。如果Server端需要验证Client端的身份,则需在发送Hello Done前发起Certificate Request,Client端就会类似Server端一样,发送证书以及Client公钥(一般Client端的证书与公钥主要通过U盾模式提供,用于安全要求较高的网银等场景)。

184:客户端答复Client key Exchange,Change Cipher Spec Protocol,Finished

Client Exchange即DH算法中的Kb(由于不验证Client端身份,所以Client不需要传递Signature)。
Change Cipher Spec代表Client已经完成了全部协商,接下来的数据包将使用TLS进行封装传输。
Finished:最后发送finish报文表示结束。

------至此双方已经交互了所有的DH算法所需的参数,均可计算得出对称密钥s。------

187:服务器端答复New Session Ticket,Change Cipher Spec Protocol,Finished

Session Ticket用于TLS中断后重新接续Session
Change Cipher Spec 代表Server端告知Client接下来的报文将使用TLS加密进行传输
Finished表示TLS连接建立过程结束

四、HTTPS报文传输

在发送Change Cipher Spec与Finished报文后,客户端即向服务器端发送加密的HTTP over TLS 报文;
服务器端在发送Change Cipher Spec与Finished报文后,同样使用HTTP over TLS应答HTTP 200 OK报文。

使用前述抓包方法可以在wireshark中解开加密的字符串,看到其中的密文:HTTP 200 OK响应报文

注:wireshark用于解密HTTPS报文的本地key,应该是指本地生成的随机数(RSA中的premaster随机数或DH中的a随机数),而非RSA公钥/私钥



相关参考RFC:
RFC5246:The Transport Layer Security (TLS) Protocol Version 1.2
RFC2818:HTTP over TLS
RFC3526:More Modular Exponential (MODP) Diffie-Hellman groups for Internet Key Exchange (IKE)
RFC5077:Transport Layer Security (TLS) Session Resumption without Server-Side State

发布了33 篇原创文章 · 获赞 19 · 访问量 3160

猜你喜欢

转载自blog.csdn.net/zmflying8177/article/details/101362723
今日推荐