Python HTTPS 服务器指南
Python 提供了内置的模块来创建 HTTPS 服务器,最常用的是 http.server 和 ssl 模块,下面我将介绍几种创建 HTTPS 服务器的不同方法。

使用 http.server 和 ssl 模块(Python 3.x)
from http.server import HTTPServer, SimpleHTTPRequestHandler
import ssl
# 创建HTTP服务器
server_address = ('', 4443)
httpd = HTTPServer(server_address, SimpleHTTPRequestHandler)
# 配置SSL
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain('server.crt', 'server.key') # 替换为你的证书和私钥路径
# 包装HTTP服务器为HTTPS服务器
httpd.socket = context.wrap_socket(httpd.socket, server_side=True)
print("HTTPS服务器启动在端口4443...")
httpd.serve_forever()
生成自签名证书(仅用于测试)
如果你没有证书,可以先生成一个自签名证书:
openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 365 -nodes
使用 Flask + Flask-Talisman
对于更复杂的Web应用,可以使用Flask框架:
from flask import Flask
from flask_talisman import Talisman
app = Flask(__name())
Talisman(app, force_https=True) # 强制使用HTTPS
@app.route('/')
def hello():
return "Hello, HTTPS World!"
if __name__ == '__main__':
app.run(ssl_context='adhoc') # 使用adhoc创建临时证书
# 或者使用证书文件: app.run(ssl_context=('server.crt', 'server.key'))
使用 FastAPI
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, HTTPS World!"}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=4443, ssl_keyfile="server.key", ssl_certfile="server.crt")
使用 aiohttp
from aiohttp import web
import ssl
app = web.Application()
async def handle(request):
return web.Response(text="Hello, HTTPS World!")
app.add_routes([web.get('/', handle)])
if __name__ == '__main__':
ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_context.load_cert_chain('server.crt', 'server.key')
web.run_app(app, host='0.0.0.0', port=4443, ssl_context=ssl_context)
注意事项
- 证书:生产环境应使用受信任的证书(如Let's Encrypt免费证书),自签名证书仅用于测试
- 端口:HTTPS默认使用443端口,可能需要管理员权限
- 安全性:确保私钥文件安全,不要泄露
- Python版本:
http.server的HTTPS支持在Python 3.7+中更稳定
生产环境建议
对于生产环境,建议使用成熟的Web服务器如Nginx或Apache作为反向代理,处理HTTPS请求,然后将流量转发到Python应用:
客户端 -> Nginx(HTTPS) -> Python应用(HTTP)
这样可以利用Nginx的高性能和成熟的SSL处理能力,同时保持Python应用的灵活性。


