【问题标题】:Python simple HTTPS forwarderPython 简单的 HTTPS 转发器
【发布时间】:2015-02-27 07:44:25
【问题描述】:

下面是我用来重定向端口 8080 上的常规 HTTP 请求的简单脚本,它会立即根据源 IP 地址重定向(使它们至少是)它们。

它可以工作(对于 HTTP),但是我希望对来自 443 端口的 HTTPS 请求具有相同的行为。假设如果重定向不存在,这个简单服务器的传入客户端将能够通过自签名证书与他们被重定向到的目标握手。

import SimpleHTTPServer
import SocketServer

LISTEN_PORT = 8080
source = "127.0.0.1"
target = "http://target/"

class simpleHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_POST(self):
        clientAddressString = ''.join(str(self.clientAddress))

        if source in clientAddressString:
            # redirect incoming request
            self.send_response(301)
            new_path = '%s%s' % (target, self.path)
            self.send_header('Location', new_path)
            self.end_headers()

handler = SocketServer.TCPServer(("", LISTEN_PORT), simpleHandler)
handler.serve_forever()

我可以使用自签名证书并可以访问通常用于此连接的文件“server.crt”和“server.key”(无需中间重定向 python 服务器)。我不确定当我像这样在两者之间进行重定向时会发生什么,尽管我认为它必须是握手链的一部分。

我怎样才能实现这种行为?

除了新目标和请求标头中的响应代码之外,我还有什么需要修改的吗?

【问题讨论】:

    标签: python ssl https socketserver simplehttpserver


    【解决方案1】:

    我将把我的答案分成网络和 Python 部分。

    网络方面,您无法在 SSL 层重定向 - 因此您需要一个完整的 HTTPS 服务器,并在 SSL 握手完成后重定向 GET/POST 请求。对于 HTTP 和 HTTPS,响应代码和实际的 do_POSTdo_GET 实现将完全相同。

    附带说明一下,您不会在重定向 POST 时遇到任何问题吗?当您在 POST 上执行 301 时,浏览器不会将 POST 数据重新发送到您的新目标,因此可能会在应用程序级别出现问题。

    Python 方面,您可以通过包装套接字将 HTTP 服务器扩充为 HTTP:

    import BaseHTTPServer, SimpleHTTPServer
    import ssl
    
    handler = BaseHTTPServer.HTTPServer(("", LISTEN_PORT), simpleHandler)
    handler.socket = ssl.wrap_socket (handler.socket, certfile='path/to/combined/PKCS12/container', server_side=True)
    handler.serve_forever()
    

    希望这会有所帮助。

    【讨论】:

    • 我不知道请求数据没有被重定向。在这种情况下,我认为使用要重定向的内容发出新请求会更有意义。或者是否有任何 *HTTPServer 模块具有这种能力?感谢您的提醒。
    • 更多的是在 HTTP 级别 - 与 Python 或 *HTTPServer 类无关。当您发出 302 或 301 响应时,您提供了一个位置。浏览器不会将相同的 POST 数据重新提交到相同的位置。如果客户端是你控制的,那你当然可以写客户端代码自动提交。
    • 我认为307响应用于保留请求方法-developer.mozilla.org/en-US/docs/Web/HTTP/Status/307
    猜你喜欢
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    相关资源
    最近更新 更多