我在我的机器上运行本地HTTP代理服务器并执行一些日志记录。我也想记录SSL流量。为此,我运行另一个用Python编写的代理服务器,它充当SSL服务器,带有我的自签名证书,HTTP服务器转发CONNECT请求。 SSL代理用于SSL处理'ssl'标准Python模块。此SSL代理应将SSL流量转发到目标Web服务器。
HTTP代理成功转发来自浏览器的CONNECT请求,浏览器和SSL代理之间的连接建立正常。并且SSL代理使用SSL套接字函数“read”从浏览器接收SSL数据包,这可能应该返回已经解密的数据。这是在SSL代理上接收的示例数据包:
'\x16\x03\x01\x00\xc5\x01\x00\x00\xc1\x03\x03\xeb\xd09\x12\xe3=$Id:\xe5\xf9<Px\xf0\xda\x81R&\x02\xcau\xd2t=@\xe9\x95\xf8\x7f\x86\x00\x00\x18\xc0+\xc0/\xc0\n\xc0\t\xc0\x13\xc0\x14\x003\x002\x009\x00/\x005\x00\n\x01\x00\x00\x80\x00\x00\x00\x17\x00\x15\x00\x00\x12wiki.archlinux.org\xff\x01\x00\x01\x00\x00\n\x00\x08\x00\x06\x00\x17\x00\x18\x00\x19\x00\x0b\x00\x02\x01\x00\x00#\x00\x003t\x00\x00\x00\x10\x00#\x00!\x05h2-15\x05h2-14\x02h2\x08spdy/3.1\x08http/1.1\x00\x05\x00\x05\x01\x00\x00\x00\x00\x00\r\x00\x12\x00\x10\x04\x01\x05\x01\x02\x01\x04\x03\x05\x03\x02\x03\x04\x02\x02\x02'
这可以被识别为具有前导0x16字节且长度为197字节的握手SSL数据包。目标服务器地址(wiki.archlinux.org)是可读的,以及协议(spdy和http),但这些数据的一般格式是什么?是否有一些工具或库可以解析这些数据包?
答案 0 :(得分:0)
这些数据的一般格式在TLS1.2及以下的RFC中有所描述。您需要解析的是像this one这样的ASN.1解析器。但在你这样做之前,你应该了解你得到了什么样的信息。否则你会发现太晚了,在所有情况下你都不会在SSL数据中找到目标服务器,因为只有在客户端使用服务器名称指示扩展时才会给出它。虽然所有现代浏览器都使用旧浏览器,但一些移动应用程序或脚本也不会这样做。这意味着您应该使用CONNECT请求中给出的目的地。
有关如何编写此类代理的更多详细信息,我建议您查看mitmproxy,它可能已经执行了您要执行的操作,或者提供了库libmproxy来帮助您编写自己的代理。它是用python编写的,所以你至少可以从开源中学习如何实现必要的功能。