简单抓了个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跳转):
在电脑浏览器输入
,此时请求的是HTTP报文。
2.1 DNS解析:获得baidu网站IP地址
2.2 TCP建立连接:HTTP服务基于TCP连接,根据前述DNS解析结果建立连接。
2.3 HTTP请求与响应:可见,服务器响应了一个302 Moved Temporarily 重定向报文,定向到 https://www.baidu.com,接下来进入HTTPS报文请求环节。
三、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公钥/私钥