删除掉通过 pip -e 安装的 mitmproxy

  • cd /usr/local/lib/python3.5/dist-packages

  • rm mitmproxy.egg-link

  • sudo vi easy-install.pth

    删除掉下面这行:

    /mnt/c6/mitmproxy

  • rm mitmproxy mitmweb mitmdump

参考文献

配置文件

  • 位置

    ~/.mitmproxy/

使用技巧

  • 同时截获请求和响应。

    ~q | ~s

  • 只截获请求。

    ~q

  • 只截获响应。

    ~s

  • 只截获响应,并且不截获 CSS, Javascript, Flash, images 的响应。

    ~s !~a

  • The default binary operator is &.

参考文献

为 mitmproxy 设置 Firefox 的证书

  • 启动 mitmproxy 并设置为 SOCKS5 代理模式。

    ./mitmproxy --socks -b 127.0.0.1

  • 设置 Firefox 的 SOCKS5 代理为:127.0.0.1:8080

  • 在 Firefox 中访问 http://mitm.it/

    点击 Other > 在弹出的对话框中选中 Trust this CA to identify websites. > 点击 OK。

  • 删除 mitmproxy 的证书。

mitmproxy 和 mitmweb

  • mitmproxy is an interactive, SSL-capable intercepting proxy with a console interface.

    ./mitmproxy --socks -b 127.0.0.1

  • mitmweb is a web-based interface for mitmproxy.

    ./mitmweb --socks -b 127.0.0.1

    1
    2
    Proxy server listening at http://127.0.0.1:8080/
    Web server listening at http://127.0.0.1:8081/
    1
    2
    --socks               Set SOCKS5 proxy mode.
    -b ADDR, --bind-address ADDR

    --socks 是代理模式(Proxy Modes)中的一个参数。
    -b 是代理选项(Proxy Options)中的一个参数。

  • mitmproxy 和 mitmweb 的大部分参数都是一样的,只是 mitmweb 对于 mitmproxy 多加了一个 Web 接口。

  • mitmproxy 和 mitmweb 的一个比较大的缺点是在 Response 中都没有 Content-Length 这个 header 的数据。

  • Chrome 的 Developer tools > Network 中也是没有 Content-Length 这个 header 的数据的。目前确定的是 Fiddler 中是有这个数据的。

  • Tamper Chrome 整体的水平也比 Fiddler 落后很多,尤其是在交互设计上。

  • 不得不说,Fiddler 仍然是目前最好的 HTTP Debug 工具。

  • mitmproxy 的优点在于它的开源和开放接口。

  • mitmproxy 是 Fiddler 的有益的补充。

  • Fiddler 的另外一个优势是在设置为系统代理截获所有请求的时候可以访问那些被墙的网站;Chrome 也可以这样,但是 mitmproxy 要想做到这样可能就要费一些功夫,做一番配置了。

为什么 mitmproxy 和 Chrome 的 Network 中在没有 Content-Length 的时候,而 Fiddler 中却有 Content-Length 呢?

  • 首先,并不是在所有的情况下 mitmproxy 和 Chrome 的 Network 中都没有 Content-Length 的。

    只有在 Transfer-Encoding: chunked 的时候,mitmproxy 和 Chrome 的 Network 中是没有 Content-Length 的。

    参考示例如下。

    Request URL: https://www.httpwatch.com/httpgallery/chunked/chunkedimage.aspx

    Fiddler:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    HTTP/1.1 200 OK
    Cache-Control: no-cache, no-store
    Pragma: no-cache
    Content-Type: image/jpeg; charset=utf-8
    Expires: -1
    Server: Microsoft-IIS/8.0
    X-AspNet-Version: 4.0.30319
    X-Powered-By: ASP.NET
    Arr-Disable-Session-Affinity: True
    Date: Fri, 25 Aug 2017 01:59:26 GMT
    Content-Length: 33653

    Chrome > Network:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    HTTP/1.1 200 OK
    Cache-Control: no-cache, no-store
    Pragma: no-cache
    Transfer-Encoding: chunked
    Content-Type: image/jpeg; charset=utf-8
    Expires: -1
    Server: Microsoft-IIS/8.0
    X-AspNet-Version: 4.0.30319
    X-Powered-By: ASP.NET
    Arr-Disable-Session-Affinity: True
    Date: Fri, 25 Aug 2017 01:04:46 GMT

    mitmproxy:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    HTTP/1.1 200 OK
    Cache-Control: no-cache, no-store
    Pragma: no-cache
    Transfer-Encoding: chunked
    Content-Type: image/jpeg; charset=utf-8
    Expires: -1
    Server: Microsoft-IIS/8.0
    X-AspNet-Version: 4.0.30319
    X-Powered-By: ASP.NET
    Arr-Disable-Session-Affinity: True
    Date: Fri, 25 Aug 2017 01:49:57 GMT
  • 那为什么会出现上面这种情况呢?

    因为 Transfer-Encoding 和 Content-Length 是不能同时存在的。

    RFC 2616, Section 4.4

    If a Content-Length header field (Section 14.13) is present, its decimal value in OCTETs represents both the entity-length and the transfer-length. The Content-Length header field must not be sent if these two lengths are different (i.e., if a Transfer-Encoding header field is present). If a message is received with both a Transfer-Encoding header field and a Content-Length header field, the latter must be ignored.

    其实 mitmproxy 和 Chrome 中 的 Netowrk 是遵守 HTTP 协议的做法;而 Fiddler 是根据用户的需要而做的改变。

  • 参考文献

参考文献