Вопрос или проблема
Я использую веб-сервер NGINX. Настроил мой сайт с параметром, при котором пользователя просят представить свой сертификат, когда он делает первый запрос на сайт, с использованием следующей настройки:
ssl_client_certificate /path/to/ca/cert/ca.crt;
ssl_verify_client on;
Когда пользователь заходит на сайт, его просят представить свой сертификат. Но после выбора сертификата он получает следующее сообщение:
400 Bad Request
Ошибка SSL сертификата
nginx/1.12.2
Лог доступа показывает: "GET / HTTP/2.0" 400 633 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, как Gecko) Chrome/83.0.4103.97 Safari/537.36"
Лог ошибок показывает: ошибка проверки SSL сертификата клиента: (2: невозможно получить сертификат удостоверяющего центра) при чтении заголовков запроса клиента, клиент: 190.130.110.5, сервер: $xyz.net, запрос: "GET / HTTP/2.0", host:
Запуск openssl verify -CAfile /etc/nginx/certs/ca.crt /etc/nginx/certs
привел к следующей ошибке:
невозможно загрузить сертификат
140622725740432:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:707:Ожидается: ДОВЕРЕННЫЙ СЕРТИФИКАТ
Я совсем новичок в NGINX и не знаю, что делать. Пожалуйста, помогите.
Ваш клиент должен представить все сертификаты в цепочке, кроме корневого CA, серверу.
Если ваш клиент – это браузер, он должен иметь доступ к сертификату CA, который выдал клиентский сертификат, а также ко всем другим промежуточным сертификатам CA до, но не обязательно включая сертификат корневого CA.
При использовании инструментов командной строки, таких как OpenSSL, файл клиентского сертификата должен быть набором сертификатов, который начинается с клиентского сертификата и содержит все другие сертификаты CA в порядке, вплоть до, но не обязательно включая, сертификат корневого CA.
В обоих случаях отправка корневого сертификата является необязательной, но не имеет смысла.
Для получения дополнительной информации прочитайте RFC 5246 Раздел 7.4.6, который ссылается на раздел 7.4.2 и структуру certificate_list
.
Ответ или решение
Решение проблемы: NGINX не может получить сертификат эмитента
Проблема, которую вы описываете, связана с ошибкой в процессе верификации клиентского сертификата на веб-сервере NGINX. Ошибка 400 Bad Request
с сообщением client SSL certificate verify error: (2:unable to get issuer certificate)
указывает на то, что NGINX не может найти сертификат удостоверяющего центра (CA), который подписал клиентский сертификат пользователя.
1. Понимание проблемы
Когда клиент (например, браузер) пытается установить соединение, он предъявляет свой сертификат. Сервер (NGINX в данном случае) должен будет проверить этот сертификат, чтобы убедиться, что он выдан доверенным центром сертификации. Чтобы это сделать, сервер должен иметь доступ к соответствующему CA сертификату и, при необходимости, к промежуточным сертификатам.
2. Проверка конфигурации NGINX
Убедитесь, что вы правильно настроили ssl_client_certificate
в конфигурационном файле NGINX. Путь к CA сертификату должен быть корректным, и сам файл должен содержать действительный сертификат.
ssl_client_certificate /path/to/ca/cert/ca.crt;
ssl_verify_client on;
Проверьте наличие файла ca.crt
и его содержание. Вы можете использовать команду:
openssl x509 -in /path/to/ca/cert/ca.crt -text -noout
Эта команда позволит вам убедиться, что файл действительно содержит сертификат.
3. Исследование ошибки OpenSSL
Ошибка, которую вы получили при выполнении команды openssl verify
, указывает на то, что в указанной вами папке /etc/nginx/certs
отсутствует корректный сертификат или же файл не распознан. Убедитесь, что в этой директории находятся все необходимые сертификаты.
Если вы столкнулись с сообщением Expecting: TRUSTED CERTIFICATE
, это может означать, что файл не в формате PEM или в нём отсутствует правильная структура. Сертификаты в формате PEM должны быть в формате:
-----BEGIN CERTIFICATE-----
(ваши данные сертификата)
-----END CERTIFICATE-----
Проверьте каждое файл на наличие этих меток и на наличие дополнительных пробелов или символов.
4. Убедитесь, что клиент отправляет полный цепочку сертификатов
Если клиентский сертификат (например, выданный пользователю) подписан промежуточным удостоверяющим центром, то клиент должен отправить полный сертификатный цепочку (клиентский сертификат, промежуточные сертификаты и т.д.), кроме корневого сертификата. Браузер или клиент должны иметь доступ к цепочке, чтобы NGINX мог проверить его.
Для командной строки с помощью OpenSSL вам нужно собрать клиентский сертификат и цепочку в один файл:
cat client.crt intermediate.crt > client_bundle.crt
Затем при запросе клиент должен использовать этот объединенный файл сертификатов.
5. Дополнительная отладка
Если проблема не устраняется, активируйте более детализированный уровень логирования в NGINX. Добавьте в ваш конфигурационный файл следующие строки для получения расширенных логов:
error_log /var/log/nginx/error.log debug;
Это поможет понять, что именно происходит во время процесса аутентификации.
6. Заключение
Обеспечение корректной верификации клиентских сертификатов в NGINX требует внимания к деталям в конфигурации и структуре сертификатов. Убедившись в том, что CA сертификаты и клиентские сертификаты правильно настроены и передаются, вы сможете устранить возникшую проблему. Не забывайте также следить за обновлениями в вашей версии NGINX, так как в более поздних версиях могут быть исправлены некоторые ошибки и улучшены механизмы обработки сертификатов.