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

Скрыть диалоговое окно сертификата клиента в браузере, но при этом разрешить сертификаты клиента

У меня есть экземпляр nginx, обслуживающий веб-приложение по HTTPS. Веб-приложение обслуживает как браузеры, так и собственные мобильные приложения. Собственные мобильные приложения используют клиентские сертификаты в качестве дополнительного уровня аутентификации, тогда как веб-браузер использует только имя пользователя и пароль. Браузер и мобильные приложения используют разные пути, но одну и ту же конечную точку TCP (IP / порт).

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

Мои требования:

EDIT: как указал Крумелур, протокол TLS позволяет инициировать повторное согласование сеанса веб-сервером, где клиент может запросить сертификат клиента, если это необходимо. Поэтому исходный ответ ниже не подходит для данной проблемы.


Аутентификация сертификата происходит во время установления связи клиент-сервер TLS, а HTTP запускается только после того, как рукопожатие было выполнено.

Строка пользовательского агента является частью HTTP-запроса, который клиент отправляет через туннель TLS. Это не известно серверу до того, как туннель TLS будет установлен и клиент не отправит свой первый HTTP-запрос.

Итак, единственный вариант - работать с TLS. Теперь, глядя на RFC 5246, глава 7.4, мы можем увидеть спецификацию сообщений Hello, которые инициируют рукопожатие TLS.

Сообщение Client Hello содержит:

  • Текущее время
  • 28 случайных байтов
  • Набор шифров
  • Список поддерживаемых методов сжатия
  • Возможные расширения TLS

Затем сервер отправляет обратно свое собственное сообщение Hello и сертификат сервера сразу после сообщения Hello. Затем он отправляет сообщение об обмене ключами сервера, а затем запрос сертификата сервера, если он настроен.

Теперь мы видим, что единственная информация, которую отправляет клиент, не включает никакой информации о типе клиента. Единственная дополнительная информация, представленная там, - это часть расширения TLS, а список текущих расширений TLS находится по адресу https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml.

В списке нет информации о типе клиента даже в расширениях TLS. Даже если бы такое расширение существовало, все мобильные клиенты или клиенты для настольных ПК должны поддерживать это расширение, прежде чем система будет работать правильно.

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

Ваш единственный вариант - использовать SNI, как предлагает @Alexey Ten