如何代理和记录SSL流量



我在机器上运行本地HTTP代理服务器并执行一些日志记录。我也想记录SSL流量。为此,我运行了另一个用Python编写的代理服务器,它充当SSL服务器,带有我的自签名证书,HTTP服务器向其发送CONNECT请求。SSL代理用于SSL处理"SSL"标准Python模块。此SSL代理应将SSL流量转发到目标web服务器。

HTTP代理成功地转发了来自浏览器的CONNECT请求,浏览器和SSL代理之间的连接建立正常。SSL代理通过SSL套接字功能"读取"从浏览器接收SSL数据包,该功能可能会返回已解密的数据。这是在SSL代理上接收的示例数据包:

'x16x03x01x00xc5x01x00x00xc1x03x03xebxd09x12xe3=$Id:xe5xf9<Pxxf0xdax81R&x02xcauxd2t=@xe9x95xf8x7fx86x00x00x18xc0+xc0/xc0nxc0txc0x13xc0x14x003x002x009x00/x005x00nx01x00x00x80x00x00x00x17x00x15x00x00x12wiki.archlinux.orgxffx01x00x01x00x00nx00x08x00x06x00x17x00x18x00x19x00x0bx00x02x01x00x00#x00x003tx00x00x00x10x00#x00!x05h2-15x05h2-14x02h2x08spdy/3.1x08http/1.1x00x05x00x05x01x00x00x00x00x00rx00x12x00x10x04x01x05x01x02x01x04x03x05x03x02x03x04x02x02x02'

这可以被识别为具有前导0x16字节和197字节长度的握手SSL数据包。目标服务器地址(wiki.archlinux.org)以及协议(spdy和http)都是可读的,但这些数据的通用格式是什么?有没有一些工具或库可以用来解析这些数据包?

TLS1.2及以下版本的RFC中描述了这些数据的通用格式。您需要解析的是像这样的ASN.1解析器。但在你这样做之前,你可能应该了解你得到了什么样的信息。否则,您会发现为时已晚,在所有情况下都无法在SSL数据中找到目标服务器,因为只有当客户端使用服务器名称指示扩展时才会给出目标服务器。虽然所有的现代浏览器都能做到这一点,但旧的浏览器却不能做到,一些移动应用程序或脚本也不能做到。这意味着您应该使用CONNECT请求中给定的目的地。

有关如何编写这样一个代理的更多详细信息,我建议您查看mitmproxy,它可能已经完成了您试图实现的功能,或者提供了库libmproxy来帮助您编写自己的代理。它是用python编写的,所以你至少可以从开源中学习如何实现必要的功能。

最新更新