【问题标题】:user authentication via ssl certs in django通过 django 中的 ssl 证书进行用户身份验证
【发布时间】:2012-03-26 11:39:05
【问题描述】:

我正在为一个封闭的用户组编写一个 Web 应用程序。它将仅通过 HTTPS 提供。服务器应通过检查用户的 SSL 证书来检查是否允许用户访问服务器。我宁愿只拥有一个白名单(例如:用户配置文件中带有用户证书的字段),而不是用我的 CA 签署他们的密钥。由于没有用户/通行证,内容将取决于客户端提供的证书。

我知道我可以将他们的证书列表提供给 apache/nginx,但我不喜欢这个解决方案,因为我需要将此列表保存在两个地方:apache(access/deny) 和 Django:auth中间件(内容取决于提供的证书)。维持这可能是一场噩梦。

有更好的方法吗?我应该让 Django 处理 SSL 吗?

【问题讨论】:

    标签: python django authentication ssl


    【解决方案1】:

    我为此创建了一个 django 模块,该实现在github 上的 MIT 许可下可用。 基本上这种方法是这样的:

    1. nginx 处理所有 SSL 和证书验证工作
    2. Django 身份验证后端将(已验证的)证书专有名称映射到您正在使用的任何 User 模型。

    【讨论】:

    • 是否可以使用flask进行客户端身份验证?
    • 我有一个 django 应用程序,客户在 USB 棒中有他们的数字证书 如何用 django 读取他们的证书
    【解决方案2】:

    首先,您谈到了两种完全不同的证书使用方式。如果您使用来自 CA 的服务器签名证书,那么用户将在页面加载之前(创建安全通道时)进行身份验证,您将知道他们是谁。您提到的另一种方式-将用户证书存储在 UserProfile 中-您的意思是存储私有证书吗?这与安全方法相去甚远。您究竟希望在用户配置文件中保留哪些内容,以便为您提供身份验证服务?如果您从 UserProfile 中读取此内容,那么用户将如何实际进行身份验证?使用用户名+密码?那么配置文件中证书的目的是什么?

    我不会在 Django 中做 SSL 的事情。处理此问题的更好方法是之后使用 HTTP 标头将所有 SSL 内容保留在 Apache 中。您向用户颁发证书,他们将其添加到浏览器中,当连接到站点时 - Django 检查证书并提取与请求关联的用户名。然后将此用户名作为 HTTP 标头传递给 Django 应用程序,例如HTTP_USER_NAME=some_user。还要确保 Apache 从客户端请求中删除所有此类标头。然后你的 Django 应用程序不应该做任何其他事情——它将依赖于 Apache 已经完成了 AUTH 工作并将获得用户名。 (这适用于 Nginx,虽然我没有在 Apache 中使用它 - 我看不出它也不应该使用它的原因,也许你需要一些额外的 apache mod 来安装)。

    因此,这种方法的唯一缺点是您可能需要进行一些手动工作来签署/向用户发送证书,但如果这不是经常重复的操作,似乎可以换取安全性优惠。

    更新:这是一个如何在 Apache 中进行 SSL 身份验证的示例: http://www.zeitoun.net/articles/client-certificate-x509-authentication-behind-reverse-proxy/start 对于 nginx: http://forum.nginx.org/read.php?5,226319

    【讨论】:

      猜你喜欢
      • 2010-11-08
      • 2012-06-13
      • 2018-06-15
      • 1970-01-01
      • 2012-10-14
      • 2019-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多