一、SSL/TLS原理简介
- SSL(Secure Sockets Layer 安全套接层),及其继任者TLS(Transport Layer Security 传输层安全)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层与应用层之间对网络连接进行加密。
- 它包括协商层(SSL Handshake)和记录层(SSL Record)两个部分。协商层包括沟通通信使用的SSL版本、信息加密用的算法、所使用的公钥算法,并要求对公钥方式对客户端进行身份认证。记录层对应用程序提供的信息进行分段、压缩、数据认证和加密,能够保障数据的机密性和报文的完整性。
HTTP协议 | |||
SSL握手协议 | SSL改变密码协议 | SSL告警协议 | 应用数据(HTTP) |
SSL记录协议 | |||
TCP | |||
IP |
二、服务器端抓包私钥解密
第一种情况(可解密):
Client直接通过Server公钥加密对称密钥,发送给Server,不使用Diffie-Hellman加密算法协商对称密钥。实验环境:Server:192.168.110.140 Client:192.168.110.129,实验文件下载链接。
上图过程:
Client------Client Hello------>Server
Client<------Server Hello,Certificate,Server hello done------Server
Client–Client Key Exchange,Change Cipher Spec,Encrypted Handshake Message->Server
Client<------Change Cipher Spec------Server
Client<------Encrypted Handshake Message------Server在第二次握手Client<-----Server Hello,Certificate,Server hello done----Server过程中,Server选择了Cipher Suite:TLS_RSA_WITH_RC4_128_MD5的加密套件来协商对称密钥。
在第三次握手Client------Client Key Exchange,Change Cipher Spec,Encrypted Handshake Message----->Server中,Client使用TLS_RSA_WITH_RC4_128_MD5加密套件的算法,通过RSA加密将私钥加密后发送给了Server,实现了Client Key Exchange
鉴于上面的情况,由于对称密钥通过RSA加密后在网络中进行了传输,当我们获得了Server的私钥后,将私钥导入到wireshark的ssl配置后,https加密数据报文就会被解密。操作步骤:edit–>Preferences–>Protocols–>SSL–>RSA keys list Edit,导入私钥。
下图得到解密的报文,这种情况下,当Server私钥丢失时,报文将面临被解密的风险,因此现在的openssl版本像TLS_RSA_WITH_RC4_128_MD5这样的加密套件已经很少使用了。
第二种情况(不可解密):
Server与Client通过Diffie-Hellman这类密钥交换算法生成对称密钥,对称密钥不通过RSA加密传输。实验环境:Server:192.168.0.103 Clinet:192.168.0.144
上图过程:
Client------Client Hello------>Server
Client<------Server Hello,Certificate,Server Key Exchange,Server hello done------Server
Client–Client Key Exchange,Change Cipher Spec,Encrypted Handshake Message->Server
Client<—New Session Ticket,Change Ciper Spec,Encrypted Handshake Message—Server在第二次握手Client<-----Server Hello,Certificate,Server hello done----Server过程中,Server选择了Cipher Suite:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384的加密套件来协商对称密钥。同时,在Server Key Exchange下面可以看到Diffie-Hellman Server Params,证明该算法使用DH协商生成对称密钥。
由于密钥协商使用了DCDHE算法,它属于DH类密钥交换算法,私钥不参与密钥的协商,故即时私钥泄漏,客户端和服务端之间的报文都无法被解密,因此无法通过导入私钥解密https流量,这叫前向安全(forward secrity)。相关类似的算法还有DHE算法,DHE下,server key exchange 如下图,可以看到DH使用的两个参数p和g。
三、客户端抓包对称密钥解密
这种情况网上文章较多,原理是某些浏览器支持将 TLS 会话中使用的对称密钥保存在外部文件中,可供 Wireshark 加密使用。具体步骤:
1、配置环境变量,SSLKEYLOGFILE C:\ssl_key\sslog.log。
2、配置Wireshark 设置文件路径,某些版本中为SSL配置。
3、重启浏览器,至此可以看到解密的https报文。
4、此时,再看一下C:\ssl_key\sslog.log文件中的内容,发现其保存的正是对称密钥的密钥随机数,且经常在发生着改变。