Назад | Перейти на главную страницу

В диалоговом окне «Выбор сертификата клиента» в FF отображается только подмножество доступных сертификатов клиентов.

проблема:

У нас есть приложение, использующее проверку подлинности сертификата клиента. Это работало без каких-либо проблем в течение многих лет, но теперь несколько клиентов сталкиваются со следующей проблемой в FF и Chrome, но не (пока) в IE: диалоговое окно «Выбрать сертификат клиента» больше не отображается, поэтому они перенаправляются на имя пользователя / пароль страницы входа. Итак, я предполагаю, что браузер не распознает установленный сертификат клиента как подходящий для имен CA, отправленных сервером.

что я проверил:

  1. Срок действия сертификата (сервера или клиента) не истек.
  2. nginx отправляет клиенту правильные имена центров сертификации. Я проверил это с помощью openssl s_client ....
  3. Я прочитал журналы изменений FF, чтобы найти что-нибудь, что могло бы показаться связанным с сертификатами клиентов, но пока ничего, что могло бы объяснить эту проблему.

что я пробовал:

  1. Я удалил «ssl_client_certificate» и «ssl_verify_depth» из конфигурации nginx, и снова появилось диалоговое окно выбора клиента в браузере, только на этот раз отображающее все установленные сертификаты, включая сертификат для нашего приложения. После выбора правильного сертификата вход прошел успешно, и приложение работало без проблем.
    Это привело меня к выводу, что что-то с именами CA, отправленными клиенту, может быть неправильным, а сами сертификаты в порядке.
  2. Как я упоминал ранее, не все клиенты сталкиваются с этой проблемой, поэтому я установил клиентский сертификат с рабочего клиента и один с неработающего клиента на тестовой машине. Следует отметить, что оба сертификата выпущены одним и тем же ЦС (рабочий сертификат всего на несколько месяцев старше). И угадайте, что: когда я пытаюсь получить доступ к приложению, появляется диалоговое окно «выбрать сертификат», но в нем отображается только один сертификат (от работающего клиента). Если я снова удалю директиву ssl_client_certificate из конфигурации nginx, я могу выбрать (и успешно войти в систему) любой из двух сертификатов. Это в отличие от (1.) похоже, что есть проблема с одним из сертификатов.

И теперь все, что я могу сделать, это процитировать г-на Самнера-Миллера: «Почему это так?»

Я надеюсь, что кто-то уже сталкивался с подобной проблемой раньше, так как единственный другой вариант, который у меня есть, - это покопаться в источнике FF и посмотреть, как создается список подходящих клиентских сертификатов. Поведение этого диалогового окна клиентского сертификата должно быть недавно изменено, поэтому я собираюсь перейти на более раннюю версию FF на моем тестовом компьютере, пока он снова не заработает.

Окружающая среда:

Сервер: CentOS 7, nginx 1.19.0, openssl 1.1.1f

Клиент: Firefox 77, Chrome 83 в Ubuntu 19.10 и несколько версий Windows.

Конфигурация nginx:

ssl_verify_client optional_no_ca;
ssl_client_certificate /etc/ssl/certs/waf_client_ca.pem;
ssl_verify_depth 2;

Примечание:

Хорошо, покопавшись в источниках FF и еще раз поискав информацию по безопасности, я нашел решение:

На https://security.stackexchange.com/questions/68491/recommended-key-usage-for-a-client-certificate Филипп Ларди описывает проверки сертификатов, выполняемые libnss, и критерии, которым необходимо соответствовать:

  • ЭКУ И КУ НЕ устанавливаются.
  • KU не установлен И EKU установлен на clientAuth И cert НЕ является ЦС.
  • KU содержит цифровую подпись, И EKU НЕ установлен
  • KU содержит digitalSignature, И для EKU установлено clientAuth, И сертификат НЕ является ЦС.

Этот пост написан в 2015 году и, похоже, больше не совсем правильный, поскольку для EKU необходимо установить clientAuth, иначе сертификат не отображается в диалоговом окне. Уже недостаточно просто установить поле KU. Это несколько странно, поскольку кажется, что эта проверка не выполняется, если сервер не передает имена CA ... Может быть, кто-то знает и может объяснить, почему это так.