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

Nginx: OCSP и клиентские сертификаты

У меня есть рабочая установка Nginx с настроенным сшиванием OCSP. Теперь я хочу добавить аутентификацию сертификата клиента для ряда URL-адресов.

Итак, я добавил ssl_client_certificate утверждение, которое указывает на сертификат ЦС, который мы используем для ограниченных URL-адресов (это частный сертификат ЦС, не подписанный каким-либо общеизвестным ЦС), и поскольку большая часть сервера все еще должна быть общедоступной, я установил ssl_verify_client к optional.

Это работает только наполовину: я могу запускать запросы с cURL (*) как с передачей сертификата, так и без него и получать ожидаемые ответы как по общедоступным URL-адресам, так и по защищенным, которые проверяют наличие сертификата.

Но теперь мой вопрос: при доступе к тем же URL-адресам в браузере (без предоставления сертификата) Nginx отвечает с ошибкой 400. Меня сбивает с толку то, что когда я использую Firefox Developer Tools для создания запроса cURL из любого из неудачных запросов и запускать их из командной строки, работает безупречно. В чем может быть проблема?

Также даже cURL -v и --trace-ascii не показывайте ничего, что могло бы объяснить мне, почему он может выйти из строя в браузере. Я не вставляю сюда всю (длинную) конфигурацию, если вы думаете, что чего-то элементарно не хватает, не стесняйтесь комментировать.

Изменить: я проверил и подтвердил, что cURL отправляет Host, User-Agent, Accept, Accept-Language, Referrer, DNT заголовки, а также файлы cookie и идентификатор сеанса и включает сжатие, как это делает Firefox.

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

Еще одно изменение: после возвращения с обеда (пока никаких изменений конфигурации) Firefox мог загрузить первую страницу и связанные ресурсы один раз. Теперь, через несколько минут, только после того, как попробовали различные запросы, т.е. без изменений, он больше не работает. Также Chrome сообщает об ошибке 400, и использование команды «Копировать как cURL» (которая снова включает все заголовки) из его инструментов разработчика показывает, что он снова работает в cURL. Также я несколько раз перепробовал все запросы, чтобы убедиться, что в поведении одного пользовательского агента нет противоречий. Я в тупике, мне все это кажется случайным.