下面是我用于重定向端口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服务器,并在SSL握手完成后重定向GET / POST请求.对于HTTP和HTTP,响应代码以及实际的do_POST或do_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()
希望这可以帮助.