аутентификация пользователя через ssl-сертификаты в django

Я пишу webaplication для закрытой группы пользователей. Он будет обслуживаться только https. Сервер должен проверить, разрешен ли пользователю доступ к серверу, проверив сертификат ssl пользователя. Я бы предпочел просто иметь белый список (поле ex с сертификатом пользователя в userprofile), чем подписывать свои ключи моим CA. Поскольку не будет пользователя/пропуска, содержимое будет зависеть от того, какой сертификат был предоставлен клиентом.

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

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

2 ответов


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

  1. nginx обрабатывает все материалы проверки SSL & сертификата
  2. бэкэнд аутентификации Django сопоставляет (проверенные) сертификаты отличительное имя с любым User модель вы используете.

прежде всего-вы говорите о двух совершенно разных способах использования сертификата. Если вы используете сертификат, подписанный сервером из ЦС, то пользователь будет аутентифицироваться перед загрузкой страницы (при создании безопасного канала), и вы будете знать, кто они. Другой способ, который вы упоминаете, - хранение сертификата пользователя в 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