You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django开发服务器双向认证:如何请求浏览器提供客户端密钥

Django开发服务器实现双向客户端证书认证(首次触发方案)

核心逻辑

双向认证的证书请求由服务器SSL层强制触发,结合Django会话机制可实现“仅首次请求验证证书”,后续通过会话标记跳过重复验证,同时兼容密码认证流程。

步骤1:用runserver_plus启用开发服务器的双向认证

Django原生开发服务器不支持双向认证,借助django-extensions的runserver_plus工具实现:

  1. 安装依赖:
pip install django-extensions Werkzeug
  1. 启动服务器时指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 08:05:06