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

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

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

Поэтому я добавил ssl_client_certificateоператор, указывающий на сертификат CA, который мы используем для ограниченных URL-адресов (это частный сертификат CA, не подписанный каким-либо публично известным CA), и поскольку большая часть сервера по-прежнему должна быть общедоступна, я установил 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. Также я попробовал все запросы несколько раз, чтобы убедиться, что нет никаких противоречий в поведении, показанном по отношению к одному пользовательскому агенту. Я в тупике, все это кажется мне очень случайным.

Связанный контент