Мы используем сертификаты на стороне клиента для аутентификации одного из наших клиентов.
Наша установка такова: у нас есть nginx перед приложением Django. В нашей конфигурации nginx у нас есть необходимые параметры, чтобы заставить работать фактическую проверку сертификата на стороне клиента (ssl_client_certificate
, ssl_verify_client
и т. д.) и
uwsgi_param X-Client-Verify $ssl_client_verify;
uwsgi_param X-Client-DN $ssl_client_s_dn;
uwsgi_param X-SSL-Issuer $ssl_client_i_dn;
Это означает, что мы получаем значения этих переменных в наше приложение Django. Затем приложение Django использует эту информацию, чтобы определить, какой пользователь подключается, и авторизовать его.
Мы успешно использовали это в течение нескольких месяцев без каких-либо проблем, когда внезапно мы начали получать отчеты о том, что люди не могут войти в систему, используя сертификаты. Оказалось, что формат $ssl_client_s_dn
и $ssl_client_i_dn
значения были изменены из формата, разделенного косой чертой:
/C=SE/O=Some organziation/CN=Some CA
в формате, разделенном запятыми:
CN=Some CA,O=Some organization,C=SE
Решить это было легко, но я не понимаю почему. Итак, мои вопросы действительно таковы:
$ssl_client_s_dn
приходить? Это установлено nginx? Клиент?Они изменились, потому что nginx изменил их в версии 1.11.6. Как показано в журнале изменений:
*) Change: format of the $ssl_client_s_dn and $ssl_client_i_dn variables has been changed to follow RFC 2253 (RFC 4514); values in the old format are available in the $ssl_client_s_dn_legacy and $ssl_client_i_dn_legacy variables.
Если вы хотите избежать подобных вещей, вам следует придерживаться стабильных выпусков, а не нестабильных основных выпусков. В любом случае, вы должны сначала протестировать, прежде чем слепо обновлять производственную среду.