如何代理和记录 SSL 流量
How to proxy and log SSL traffic
我 运行 我机器上的本地 HTTP 代理服务器并执行一些日志记录。我也想记录 SSL 流量。为此,我 运行 另一个代理服务器,用 Python 编写,它充当 SSL 服务器,带有我的自签名证书,HTTP 服务器将 CONNECT 请求转发到该服务器。 SSL 代理使用 SSL 处理 'ssl' 标准 Python 模块。此 SSL 代理应将 SSL 流量转发到目标 Web 服务器。
HTTP 代理成功转发来自浏览器的CONNECT 请求,浏览器和SSL 代理之间的连接建立正常。并且SSL代理从具有SSL套接字函数'read'的浏览器接收SSL数据包,推测应该return已经解密数据。这是在 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'
这可以被识别为握手SSL数据包,前导为0x16字节,长度为197字节。目标服务器地址(wiki.archlinux.org)是可读的,还有协议(spdy和http),但是这个数据的一般格式是什么?是否有一些工具或库可以用来解析这些数据包?
TLS1.2 and below. What you need to parse is an ASN.1 parser like this one 的 RFC 中描述了这些数据的一般格式。但在你这样做之前,你可能应该了解你得到了什么样的信息。否则你会发现为时已晚,你不会在所有情况下都在 SSL 数据中找到目标服务器,因为它仅在客户端使用服务器名称指示扩展时才会给出。虽然所有现代浏览器都这样做,但较旧的浏览器不会这样做,而且某些移动应用程序或脚本也不会这样做。这意味着您应该改用 CONNECT 请求中给出的目的地。
有关如何编写此类代理的更多详细信息,我建议您查看 mitmproxy which maybe already does what you are trying to implement or provides the library libmproxy 以帮助您编写自己的代理。它是用 python 编写的,因此您至少可以从开源中学习如何实现必要的功能。
我 运行 我机器上的本地 HTTP 代理服务器并执行一些日志记录。我也想记录 SSL 流量。为此,我 运行 另一个代理服务器,用 Python 编写,它充当 SSL 服务器,带有我的自签名证书,HTTP 服务器将 CONNECT 请求转发到该服务器。 SSL 代理使用 SSL 处理 'ssl' 标准 Python 模块。此 SSL 代理应将 SSL 流量转发到目标 Web 服务器。
HTTP 代理成功转发来自浏览器的CONNECT 请求,浏览器和SSL 代理之间的连接建立正常。并且SSL代理从具有SSL套接字函数'read'的浏览器接收SSL数据包,推测应该return已经解密数据。这是在 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'
这可以被识别为握手SSL数据包,前导为0x16字节,长度为197字节。目标服务器地址(wiki.archlinux.org)是可读的,还有协议(spdy和http),但是这个数据的一般格式是什么?是否有一些工具或库可以用来解析这些数据包?
TLS1.2 and below. What you need to parse is an ASN.1 parser like this one 的 RFC 中描述了这些数据的一般格式。但在你这样做之前,你可能应该了解你得到了什么样的信息。否则你会发现为时已晚,你不会在所有情况下都在 SSL 数据中找到目标服务器,因为它仅在客户端使用服务器名称指示扩展时才会给出。虽然所有现代浏览器都这样做,但较旧的浏览器不会这样做,而且某些移动应用程序或脚本也不会这样做。这意味着您应该改用 CONNECT 请求中给出的目的地。
有关如何编写此类代理的更多详细信息,我建议您查看 mitmproxy which maybe already does what you are trying to implement or provides the library libmproxy 以帮助您编写自己的代理。它是用 python 编写的,因此您至少可以从开源中学习如何实现必要的功能。