如何使用libmproxy处理https流量?

时间:2013-12-26 19:43:59

标签: ssl https proxy 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()

然后我将firefox中的http和ssl代理配置为127.0.0.1端口1234. http似乎工作正常,因为我可以看到所有标题都打印出来。但是,当浏览器发送https请求时,代理服务器根本不打印任何内容,浏览器显示“连接中断”错误。

进一步调查显示,https请求通过代理服务器而不是controller.Master。我看到当存在https请求时正在调用proxy.ProxyHandler.establish_ssl(),但请求不通过controller.Master.handle_request()。尽管调用了establish_ssl(),但浏览器似乎没有得到任何响应。我用https://www.google.com测试了这个。

首先,如何使用https请求/响应使proxy.ProxyHandler正常工作?其次,如何修改controller.Master以便拦截https请求?我也对其他工具持开放态度,我可以在其上构建自定义http / https代理服务器。

1 个答案:

答案 0 :(得分:0)

您需要在正在测试的浏览器中安装mitmproxy CA.

请在此处查看详细信息(“安装mitmproxy CA”部分):

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

这解决了我的问题。