原理让我们回顾一下整个SSL/TLS握手过程:(1)Clienthello:将客户端的能力和偏好发送给服务器。建立连接后,当你想重新协商时,或响应服务器的重新协商请求而发送。(2)版本:客户端支持的最佳协议版本(3)随机:共32字节,28字节随机数,4字节附加信息,受客户端时钟影响(为了避免浏览器指纹采集,现在一般会扭曲4字节的时钟)(4)SessionID:32字节的随机数,用于重新创建与服务器的会话,为空表示新的会话(5)ciphersuit:支持的所有密码套件client,按优先级排列(6)Compression:客户端支持的压缩算法,默认不压缩(7)Extensions:由任意数量的extension组成,携带附加数据(8)ServerHello:选择client提供的参数反馈给客户端服务器不需要支持客户端支持的最好的版本。如果服务端不支持客户端版本,可以提供其他版本期望客户端接受。(9)证书:用于承载服务器X.509证书链的初级证书必须先发送,中间证书必须以正确的方式发送。顺序在主证书之后。服务器必须确保发送的证书与选择的算法套件一致。可选(10)ServerKeyExchange:携带密钥交换的附加数据,取决于加密套件(11)ServerHelloDone:服务器已经发送了所有预期的握手消息(12)ClientkeyExchange:携带客户端提供的用于密钥交换的信息(13)ChangeCipherSpec:发送方已经获得足够的连接参数信息(14)Finish:握手完成,消息内容加密,双方可以交换验证,整个握手的完整性所需要的数据(15)算法:verrify_data=PRF(master_secret,finished_label,hash(handshake_message))解密HTTPS流量,需要得到加密密钥,加密密钥由主密钥、客户端随机数、服务器随机数生成决定。从上面的握手过程我们可以看出,客户端的随机数和服务端的随机数在双方的握手报文中传递,两个随机数结合生成主密钥(master_secret)预主密钥(pre_master_secret)。预主密钥通过密码套件(DH、RSA)中的密钥交换算法进行交换。因此,通过Wireshark解密HTTPS,可以从两个地方着手:选择RSA作为密钥交换算法,然后提取服务器的私钥,将私钥导入Wireshark,解密密钥过程中传递的pre-masterkey通过Wireshark交换过程,然后结合之前的客户端和服务器随机数生成主密钥,进一步生成加密密钥,用于解密后续捕获的加密消息。直接从客户端提取主密钥,结合客户端和服务端的随机数生成加密密钥,实现加密报文的解密。下面演示了两种解密HTTPS流量的方法。方法1从服务器导出带有私钥的P12格式的证书,或者直接导出服务器的私钥。抓取从TCP三次握手开始的完整报文:可以看到此时的报文是经过TLS加密的,看不到具体的报文内容。点击Edit—>Preferences—>Protocol—>SSL(有的版本只有TLS),导入RSA密钥:由于中间不会传递通过DH方式交换的密钥,所以该方式只能通过RSA交换密钥解密.导入服务器证书:点击确定后,Wireshark会对抓取的报文进行解密:报文解密成功,可以直观的看到HTTP报文的请求和响应。二是通过设置环境变量拦截浏览器的master_secret,进而达到解密HTTPS的目的。在环境变量中新建用户变量SSLKEYLOGFILE=path\sslkey.log文件,然后在wireshark中的ssl配置中指定文件位置。点击Edit>Preferences>protocol>ssl:解密浏览器的访问流量:
