Назад |
Перейти на главную страницу
В диалоговом окне «Выбор сертификата клиента» в FF отображается только подмножество доступных сертификатов клиентов.
проблема:
У нас есть приложение, использующее проверку подлинности сертификата клиента. Это работало без каких-либо проблем в течение многих лет, но теперь несколько клиентов сталкиваются со следующей проблемой в FF и Chrome, но не (пока) в IE: диалоговое окно «Выбрать сертификат клиента» больше не отображается, поэтому они перенаправляются на имя пользователя / пароль страницы входа. Итак, я предполагаю, что браузер не распознает установленный сертификат клиента как подходящий для имен CA, отправленных сервером.
что я проверил:
- Срок действия сертификата (сервера или клиента) не истек.
- nginx отправляет клиенту правильные имена центров сертификации. Я проверил это с помощью openssl s_client ....
- Я прочитал журналы изменений FF, чтобы найти что-нибудь, что могло бы показаться связанным с сертификатами клиентов, но пока ничего, что могло бы объяснить эту проблему.
что я пробовал:
- Я удалил «ssl_client_certificate» и «ssl_verify_depth» из конфигурации nginx, и снова появилось диалоговое окно выбора клиента в браузере, только на этот раз отображающее все установленные сертификаты, включая сертификат для нашего приложения. После выбора правильного сертификата вход прошел успешно, и приложение работало без проблем.
Это привело меня к выводу, что что-то с именами CA, отправленными клиенту, может быть неправильным, а сами сертификаты в порядке. - Как я упоминал ранее, не все клиенты сталкиваются с этой проблемой, поэтому я установил клиентский сертификат с рабочего клиента и один с неработающего клиента на тестовой машине. Следует отметить, что оба сертификата выпущены одним и тем же ЦС (рабочий сертификат всего на несколько месяцев старше). И угадайте, что: когда я пытаюсь получить доступ к приложению, появляется диалоговое окно «выбрать сертификат», но в нем отображается только один сертификат (от работающего клиента). Если я снова удалю директиву 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;
Примечание:
- "optional_no_ca" присутствует потому, что проверка клиентских сертификатов выполняется вне nginx по "историческим причинам". поведение браузера не изменится, если я выберу «да» или «необязательно».
- Было бы очень плохо, если бы мне пришлось заменить все эти сертификаты, так что да: я уже думал о создании нового центра сертификации и выдаче новых сертификатов для всех клиентов, но их тысячи, поэтому я действительно стараюсь этого избежать. По крайней мере, до тех пор, пока я точно не буду знать, что не так с некоторыми из существующих.
Хорошо, покопавшись в источниках 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 ... Может быть, кто-то знает и может объяснить, почему это так.