Django开发服务器双向认证:如何请求浏览器提供客户端密钥
Django开发服务器实现双向客户端证书认证(首次触发方案)
核心逻辑
双向认证的证书请求由服务器SSL层强制触发,结合Django会话机制可实现“仅首次请求验证证书”,后续通过会话标记跳过重复验证,同时兼容密码认证流程。
步骤1:用runserver_plus启用开发服务器的双向认证
Django原生开发服务器不支持双向认证,借助django-extensions的runserver_plus工具实现:
- 安装依赖:
pip install django-extensions Werkzeug
- 启动服务器时指定SSL相关文件:
python manage.py runserver_plus --cert server.crt --key server.key --ssl-ca-cert ca.crt
server.crt/key:服务器的证书和私钥ca.crt:签发客户端证书的CA根证书,用于服务器验证客户端证书合法性
步骤2:通过中间件控制证书验证时机
浏览器的证书选择弹窗由SSL层触发,无法直接在视图中控制,需用中间件结合会话实现“仅首次验证”:
# myapp/middleware.py class MutualAuthMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 检查会话是否已完成证书认证 if request.session.get('client_cert_verified', False): return self.get_response(request) # runserver_plus会将客户端证书信息存入META client_cert = request.META.get('SSL_CLIENT_CERT') if client_cert: # 可选:解析证书提取用户标识(如CN字段) import OpenSSL.crypto cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, client_cert) request.session['client_cert_verified'] = True request.session['client_cert_cn'] = cert.get_subject().CN response = self.get_response(request) return response
在settings.py中注册中间件:
MIDDLEWARE = [ # 其他中间件... 'myapp.middleware.MutualAuthMiddleware', ]
步骤3:兼容密码认证流程
- 首次访问受保护路由时,SSL层自动触发浏览器证书选择弹窗,验证通过后会话标记为已认证
- 后续请求直接读取会话标记,无需再次触发证书验证,可正常走密码认证流程
- 若客户端未导入证书,SSL层会直接拒绝请求,需提前将客户端证书(.p12/.pfx格式)导入浏览器
关键注意事项
- 该方案仅用于开发测试,生产环境建议用Nginx/Apache等反向代理配置双向认证,再转发请求到Django
- 确保客户端证书由指定CA签发,否则服务器会拒绝验证
内容的提问来源于stack exchange,提问作者ron
相关产品推荐
相关产品推荐

