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

时间:2012-03-26 11:39:05

标签: python django authentication ssl

我正在为一个封闭的用户组编写一个webaplication。它仅适用于https。服务器应检查是否允许用户通过检查用户ssl证书来访问服务器。我希望只有一个白名单(在userprofile中具有用户证书的ex字段),而不是由我的CA签署他们的密钥。由于没有用户/通行证,内容将取决于客户提供的证书。

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

还有其他好办法吗?也许我应该让django接受ssl的事情?

2 个答案:

答案 0 :(得分:10)

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

  1. nginx处理所有SSL&证书验证材料
  2. Django身份验证后端将(已验证的)证书可分辨名称映射到您正在使用的任何User模型。

答案 1 :(得分:0)

首先 - 您谈论两种完全不同的使用证书的方式。如果您使用来自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