【问题标题】:Dealing with HTTPS CONNECT requests处理 HTTPS CONNECT 请求
【发布时间】:2017-08-17 18:43:36
【问题描述】:

我正在通过 python 编写一个非常简单的网络代理,现在我正在处理 HTTPS CONNECT 请求,以便我可以打开 HTTPS 网站。我正在尝试设置 SSL 隧道,但我的代码不太正确。我想我已经很接近了,但是如果有人可以看一下并将我推向正确的方向,那就太好了。我目前对我应该做什么的理解是

  • 识别请求是 CONNECT 请求
  • 按照我在代码中的变量 connect_req 中定义的方式将消息发送回浏览器
  • 就是这样

这是我的代码:

def ProxyThread(conn, client_addr):
    request = conn.recv(MAX_BUFFER)
    #print request
    # Parsing
    method, webserver, port = ParseReq(request)
    print 'Request = ' + method + ' ' + webserver + ':' + str(port) + '\n'

    try:
        serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        serverSocket.connect((webserver, port))

        if method == 'CONNECT':
            connect_req = 'HTTP/1.1 200 Connection established\r\n'
            connect_req += 'Proxy-agent: localhost\r\n\r\n'

            conn.send(connect_req.encode())

        serverSocket.send(connect_req)

        while 1:
            data = serverSocket.recv(MAX_BUFFER)

        # while there is data to receive from server
            if len(data) > 0:
                conn.send(data)

            else:
                break

        serverSocket.close()
        conn.close()

    except socket.error, (message):
        print message

        if conn:
            conn.close()

        if serverSocket:
            serverSocket.close()
        return

编辑 1:更新代码以在我收到 HTTPS 请求时启动线程

def ProxyThread(conn, client_addr):
    request = conn.recv(MAX_BUFFER)
    method, webserver, port = ParseReq(request)

    #Handle index out of range exception - Throw out the request
    if method is None or webserver is None or port is -1:
        return

    print 'Request = ' + method + ' ' + webserver + ':' + str(port) + ' START\n'

    serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    try:
        if method == 'CONNECT':
            connect_req = 'HTTP/1.0 200 Connection established\r\n'
            connect_req += 'Proxy-agent: ProxyServer/1.0\r\n'
            connect_req += '\r\n'
            print connect_req
            conn.send(connect_req)
            thread = threading.Thread(target=HTTPSProxyThread, args=(conn, serverSocket))
            thread.start()

        serverSocket.connect((webserver, port))
        serverSocket.send(request)

        while 1:
            data = serverSocket.recv(MAX_BUFFER)

        # while there is data to receive from server
            if len(data) > 0:
                conn.send(data)

            else:
                break

        print 'Request = ' + method + ' ' + webserver + ':' + str(port) + ' FINISH\n'
        serverSocket.close()

        conn.close()


def HTTPSProxyThread(conn, serverSocket):
    while 1:
        request = conn.recv(MAX_BUFFER)
        print request
        method, webserver, port = ParseReq(request)
        serverSocket.connect((webserver, port))
        serverSocket.send(request)

        while 1:
            data = serverSocket.recv(MAX_BUFFER)

        # while there is data to receive from server
            if len(data) > 0:
                conn.send(data)

            else:
                break

【问题讨论】:

    标签: python http https proxy webproxy


    【解决方案1】:

    现在很多人似乎都在用 Python 或 Node.js 构建自己的网络代理。

    作为一个在过去 22 年里一直在制作网络代理的人,我想知道为什么人们自己这样做,尤其是在所有主要平台上都有免费产品可用的情况下,有人已经处理过诸如(一些其中你将不得不稍后处理)

    • 隧道 (CONNECT)
    • 分块
    • HTTP 身份验证
    • 来自数量惊人的服务器和客户端的时髦不合规行为。
    • 性能
    • 可扩展性
    • 日志记录
    • 缓存
    • 政策框架和执行

    虽然这是一种消磨时间的有趣方式,但如果将这些简单的实现用于更一般的流量,那么这些代理越多,整个网络就会变得越糟糕。如果您只是将其用于您自己的特定部署要求,请忽略此评论。

    我想我想说的是,制作一个行为良好(更不用说高性能)的 Web 代理并非易事。

    【讨论】:

    • 这是大学作业...¯_(ツ)_/¯
    • 酷 - 是的应该提到学习这些东西也很有教育意义。要理解 CONNECT,首先需要考虑它实际上是一条 HTTP 消息。客户端向服务器发送 HTTP 消息,服务器必须发送 HTTP 响应。在 CONNECT 的情况下,响应消息指示上游连接是否成功(因此作为代理,您需要连接上游,如果成功则需要发送 200 响应,然后进入流水线模式)。
    • 您能否详细介绍一下如何处理 HTTP CONNECT 响应。我目前对要做什么的理解是将“HTTP/1.0 200 Connection established\r\nProxy-agent: ProxyServer/1.0\r\n\r\n”消息发送回客户端,然后我有点迷失了至于从那里做什么。目前我只是让正在运行的线程返回预期客户端现在将在建立安全连接后发送 GET 请求,但它只是挂起并且什么都不做。
    • 你的意思是如何发出响应?你是代理服务器。您需要做的就是发回 200 OK 消息。消息必须格式正确,客户端才能接受它,因此它需要一个日期、服务器等字段。也没有 Proxy-Agent 之类的字段。客户是什么,它抱怨什么错误?
    • 是的,抱歉,我并不清楚我所处的位置。我知道浏览器正在接收我的 200 OK 消息,我可以在 Firefox 中进入开发模式并看到它发生。问题是,一旦我发送该消息,浏览器什么也不做,nada。没有更多的 GET 请求或任何东西。我将使用我当前的代码以及终端窗口和 Firefox 屏幕上的程序输出的一些屏幕截图来更新问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    相关资源
    最近更新 更多