标签 mitmproxy 下的文章

修改 mitmproxy 1.8.X 代理认证方式


原因:mitmproxy 1.8.x 不支持https代理认证,他在mitmproxy 2.0.x的时候据说修复了,但是需要 python 3.0的环境,我也没测试,项目也不能升级python版本,所以修改了下认证模块。

先感谢下猪猪侠,做了一个项目用到了猪猪侠的wyproxy,wyproxy采用了mitmproxy 1.8.x版本。有需求做代理认证的时候发现他对https的根本不支持,所以改了下认证方式。

wyproxy地址https://github.com/ring04h/wyproxy 再次感谢猪猪侠,有这个省事了很多。

mitmproxy在github上的issuehttps://github.com/mitmproxy/mitmproxy/issues/1722

如使用1.8.X版本的时候去请求https站点会返回:状态码为401,内容为:Authentication Required。

看了下mitmproxy 代理认证那块的代码。

http协议采用状态码为407.
https协议采用状态码为401.

知道这些东西后就好改代码了。

wyproxy.py文件添加几个函数:


def auth(f,check):
    """
    f.response.status_code = 401
    WWW-Authenticate    401
    Proxy-Authenticate  407
    f.response.headers['WWW-Authenticate'] = 'Basic realm="mitmproxy"'
    添加基础认证
    """
    if check:
        f.response.status_code = 401
        f.response.headers["WWW-Authenticate"] = "Basic realm=\"mitmproxy\""
    else:
        f.response.status_code = 407
        f.response.headers["Proxy-Authenticate"] = "Basic realm=\"mitmproxy\""
    return f

def authcheck(username='', password=''):
    """
    验证代理账号密码是否正确
    """
    from passlib.apache import HtpasswdFile
    ht = HtpasswdFile("./.htpasswd")
    status = ht.check_password(username, password)
    return status

def response_auth(f):
    """
    Authorization       401
    Proxy-Authorization 407
    用f.server_conn.ssl_established 来判断是http还是https
    判断是http 还是https
    验证代理账号密码是否正确
    """
    auth_user = ''
    auth_password = ''
    #判断header头部是那种认证方式
    if f.server_conn.ssl_established:
        auth_type = 'Authorization'
    else:
        auth_type = 'Proxy-Authorization'

    if f.request.headers.get(auth_type):
        try:
            auth_base64 = f.request.headers.get(auth_type).split(' ')
            auth_user = base64.b64decode(auth_base64[1]).split(':')[0]
            auth_password = base64.b64decode(auth_base64[1]).split(':')[1]
        except Exception,e:
            print(e)

    if not authcheck(auth_user, auth_password):
        f = auth(f, f.server_conn.ssl_established)
    return f

44444.jpg

搜索代码"def response(self, f):" ,在后面添加代码:f = response_auth(f)

如下图

5555.jpg