Как обрабатывать https-трафик с помощью libmproxy?

Я хочу реализовать прокси-сервер, который перехватывает запросы 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.


person mangpo    schedule 26.12.2013    source источник


Ответы (1)


Вам необходимо установить mitmproxy CA в браузере, который вы тестируете.

Подробнее см. здесь (раздел «Установка ЦС mitmproxy»):

http://mitmproxy.org/doc/ssl.html

Это решило проблему для меня.

person Sagi Iltus    schedule 17.06.2014