Python django中通过ssl证书的用户身份验证

Python django中通过ssl证书的用户身份验证,python,django,authentication,ssl,Python,Django,Authentication,Ssl,我正在为一个封闭的用户组编写一个WebApplication。只提供https服务。服务器应通过检查用户ssl证书来检查是否允许用户访问服务器。我更喜欢有一个白名单(在userprofile中有用户证书的ex字段),而不是由我的CA对其密钥进行签名。因为没有用户/通行证,内容将取决于客户端提供的证书 我知道我可以向apache/nginx提供他们的证书列表,但我不喜欢这个解决方案,因为我需要将这个列表保存在两个地方:apache(access/deny)和django:auth中间件(内容取决于

我正在为一个封闭的用户组编写一个WebApplication。只提供https服务。服务器应通过检查用户ssl证书来检查是否允许用户访问服务器。我更喜欢有一个白名单(在userprofile中有用户证书的ex字段),而不是由我的CA对其密钥进行签名。因为没有用户/通行证,内容将取决于客户端提供的证书

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


还有别的好办法吗?也许我应该让django来处理ssl问题?

首先,您将讨论使用证书的两种完全不同的方法。如果您使用来自CA的服务器签名证书,则用户将在页面加载之前进行身份验证(创建安全通道时),您将知道他们是谁。你提到的另一种方式——在UserProfile中存储用户证书——你的意思是存储私人证书吗??这远远不是安全的方法。您希望在用户配置文件中保留哪些内容,用于身份验证目的?如果你从UserProfile中读到这个东西,那么用户实际上将如何进行身份验证?使用用户名+密码?那么,个人资料中证书的用途是什么

我不会在Django做SSL的事情。更好的处理方法是在Apache中保留所有SSL内容,之后使用HTTP头。您向用户颁发证书,用户将其添加到浏览器中,当连接到站点时,Django检查证书并提取与请求关联的用户名。然后将此用户名作为HTTP头传递给Django应用程序,例如HTTP_USER_NAME=some_USER。还要确保Apache从客户机的请求中删除所有这样的头。然后,您的Django应用程序不应该做任何其他事情——它将依赖于Apache已经完成了身份验证工作,并将获得用户名。(这在Nginx上运行良好,尽管我没有在Apache中使用过它,但我不认为有理由不使用它,也许您需要一些额外的Apache mod来安装)

因此,这种方法的唯一缺点是,您可能需要手动为用户签名/发送证书,但如果这不是一个经常重复的操作,那么作为它提供的安全性的回报,似乎是可以的

更新:以下是如何在Apache中执行SSL身份验证的示例: 对于nginx:

我已经为此创建了一个django模块,该实现可在上获得MIT许可证。 基本上,方法是:

  • nginx处理所有的SSL和证书验证工作
  • Django身份验证后端将(已验证的)证书可分辨名称映射到您正在使用的任何
    用户
    模型

  • 是否可以使用flask进行客户机身份验证?我有一个django应用程序,客户机的数字证书在U盘中。如何使用django读取证书