Я хочу реализовать прокси-сервер, который перехватывает запросы http и https. Я наткнулся на libmproxy (http://mitmproxy.org/doc/scripting/libmproxy.html), что он поддерживает SSL. Я начинаю с этого простейшего прокси, который просто печатает заголовки всех запросов и ответов и обычно пересылает их клиентам и серверам.
#!/usr/bin/env python
from libmproxy import controller, proxy
import os
class Master(controller.Master):
def __init__(self, server):
controller.Master.__init__(self, server)
self.stickyhosts = {}
def run(self):
try:
return controller.Master.run(self)
except KeyboardInterrupt:
self.shutdown()
def handle_request(self, msg):
print "handle request.................................................."
print msg.headers
msg.reply()
def handle_response(self, msg):
print "handle response................................................."
print msg.headers
msg.reply()
config = proxy.ProxyConfig(
cacert = os.path.expanduser("~/.mitmproxy/mitmproxy-ca.pem")
)
server = proxy.ProxyServer(config, 1234)
m = Master(server)
m.run()
Затем я настраиваю http и ssl прокси в firefox на порт 127.0.0.1 1234. HTTP работает нормально, так как я вижу, что все заголовки распечатаны. Однако, когда браузер отправляет https-запросы, прокси-сервер вообще ничего не печатает, а браузер выдает ошибку «соединение было прервано».
Дальнейшее расследование показывает, что запросы https проходят через прокси-сервер, но не через controller.Master. Я вижу, что proxy.ProxyHandler.install_ssl() вызывается, когда есть запрос https, но запрос не проходит через controller.Master.handle_request(). Несмотря на то, что вызывается install_ssl(), браузер, похоже, не получает никакого ответа. Я тестирую это с помощью https://www.google.com.
Во-первых, как заставить proxy.ProxyHandler правильно работать с HTTPS-запросами/ответами? Во-вторых, как я могу изменить controller.Master, чтобы он мог перехватывать запросы https? Я также открыт для других инструментов, на основе которых я могу создать собственный прокси-сервер http/https.