能否为任意运行中的HTTP服务器添加SSL封装转为HTTPS服务器?
能否为运行中的HTTP服务器添加SSL封装转为HTTPS?
答案是:无法直接对已运行的HTTP服务器进程本身进行SSL封装,但可以通过反向代理的方式实现等效效果,将443端口的HTTPS请求转发到原HTTP服务的8080端口。
为什么不能直接修改运行中的HTTP服务?
普通的HTTP服务器启动时会创建并监听明文的TCP socket,这个socket没有经过SSL/TLS加密层包装。运行中的进程无法动态修改已建立的socket的加密属性,除非服务本身内置了动态加载SSL配置的功能(这类情况非常少见)。
可行的解决方案:反向代理
反向代理相当于在原HTTP服务前增加一层SSL终止层,由代理接收HTTPS请求,解密后转发给后端的HTTP服务,再将响应加密后返回给客户端。
方案1:使用Nginx(推荐用于生产环境)
配置Nginx监听443端口并启用SSL,将请求转发到本地8080端口的HTTP服务:
server { listen 443 ssl; server_name your-domain.com; ssl_certificate /path/to/public_cert.pem; ssl_certificate_key /path/to/private_key.pem; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
方案2:用Python实现简易SSL代理
如果需要轻量的解决方案,可以基于你提供的HTTPS服务器代码改造成代理,转发请求到8080端口:
import ssl from http.server import HTTPServer, BaseHTTPRequestHandler import http.client class ProxyHandler(BaseHTTPRequestHandler): def do_GET(self): # 转发GET请求到8080的HTTP服务 conn = http.client.HTTPConnection("localhost", 8080) conn.request("GET", self.path) response = conn.getresponse() # 将后端响应返回给客户端 self.send_response(response.status) for header, value in response.getheaders(): self.send_header(header, value) self.end_headers() self.wfile.write(response.read()) # 支持POST请求转发 def do_POST(self): content_length = int(self.headers['Content-Length']) post_data = self.rfile.read(content_length) conn = http.client.HTTPConnection("localhost", 8080) conn.request("POST", self.path, post_data, dict(self.headers)) response = conn.getresponse() self.send_response(response.status) for header, value in response.getheaders(): self.send_header(header, value) self.end_headers() self.wfile.write(response.read()) if __name__ == "__main__": server_ip = '0.0.0.0' server_port = 443 httpd = HTTPServer((server_ip, server_port), ProxyHandler) httpd.socket = ssl.wrap_socket( httpd.socket, certfile='./public_cert.pem', keyfile='./private_key.pem', server_side=True ) httpd.serve_forever()
额外说明
如果你是自己开发的HTTP服务,最直接的方式是在启动阶段就像你提供的示例那样,对服务器socket进行SSL封装,而不是等服务运行后再尝试修改。
内容的提问来源于stack exchange,提问作者Pradeep Padmanaban C
相关产品推荐
相关产品推荐

