Python简单的HTTPS转发器

时间:2015-02-27 07:44:26

标签: python ssl https socketserver simplehttpserver

下面是我用来在端口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服务器)。我不确定当我在这两者之间进行重定向时会发生什么,尽管我认为它必须是握手链的一部分。

我该如何实现这种行为?

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

1 个答案:

答案 0 :(得分:3)

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

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

作为旁注,您是否在重定向POST时遇到任何问题?当您在POST上执行301时,浏览器不会将POST数据重新发送到新目标,因此在应用程序级别可能会出现问题。

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

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()

希望这有帮助。