аутентификация пользователя через ssl-сертификаты в django - PullRequest
8 голосов
/ 26 марта 2012

Я пишу веб-приложение для закрытой группы пользователей. Это будет обслуживаться только https. Сервер должен проверить, разрешен ли пользователю доступ к серверу, проверив SSL-сертификат пользователя. Я бы предпочел просто иметь белый список (например, поле с именем пользователя в userprofile), чем подписывать их ключи моим ЦС. Поскольку не будет никакого пользователя / прохода, контент будет зависеть от того, какой сертификат был предоставлен клиентом.

Я знаю, что могу просто предоставить список своих сертификатов в apache / nginx, но мне не нравится это решение, потому что мне нужно было бы хранить этот список в двух местах: apache (access / deny) и django: auth middleware ( содержание зависит от того, какой сертификат был предоставлен). Поддержание этого может быть кошмаром.

Есть ли другой хороший способ сделать это? Может быть, я должен позволить Джанго взять вещь SSL?

Ответы [ 2 ]

10 голосов
/ 06 июня 2013

Я создал для этого модуль django, реализация доступна под лицензией MIT на github .В основном подход таков:

  1. nginx обрабатывает все средства проверки SSL и сертификатов
  2. Бэкэнд аутентификации Django отображает (проверенные) отличительные имена сертификатов в любую User модель, которую выиспользуете.
0 голосов
/ 10 июня 2012

Прежде всего - вы говорите о двух совершенно разных способах использования сертификата. Если вы используете подписанный сервером сертификат от ЦС, то пользователь будет проходить аутентификацию перед загрузкой страницы (при создании безопасного канала), и вы будете знать, кто они. Другой способ, который вы упомянули - сохранение пользовательского сертификата в UserProfile - вы имеете в виду сохранение частного сертификата ?? Это далеко от безопасного подхода. Что именно вы ожидаете сохранить в профиле пользователя, который будет служить вам для аутентификации? И если вы читаете эту вещь из UserProfile, то как пользователь будет на самом деле аутентифицироваться? Используя имя пользователя + пароль? Так какова цель сертификата в профиле?

Я бы не стал использовать SSL в Django. Более лучший подход для решения этой проблемы - сохранить все содержимое SSL в Apache, используя впоследствии HTTP-заголовок. Вы выдаете сертификат пользователю, он добавляет его в свои браузеры, а при подключении к сайту - Django проверяет сертификат и извлекает имя пользователя, связанное с запросом. Затем передайте это имя пользователя в качестве заголовка HTTP приложению Django, например, HTTP_USER_NAME = some_user. Также убедитесь, что Apache удаляет все такие заголовки из запроса клиента. Тогда ваше приложение Django не должно делать ничего другого - оно будет полагаться, что Apache уже выполнил работу AUTH и получит имя пользователя. (Это нормально работает с Nginx, и хотя я не использовал его в Apache - я не вижу причины, по которой это тоже не должно быть возможно, возможно, вам понадобится какой-то дополнительный мод apache для установки).

Таким образом, единственным недостатком этого подхода является то, что вам, вероятно, придется выполнить некоторую ручную работу с подписанием / отправкой сертификатов пользователю, но если это не часто повторяющаяся операция, кажется, все в порядке в обмен на ее безопасность. предлагает.

ОБНОВЛЕНИЕ : Вот пример того, как выполнить аутентификацию SSL в Apache: http://www.zeitoun.net/articles/client-certificate-x509-authentication-behind-reverse-proxy/start и для nginx: http://forum.nginx.org/read.php?5,226319

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...