Вопрос или проблема
Является ли проблемой одновременное использование nginx с включенными опциями ssl_verify_client
и proxy_pass
?
Первый сервер (LB) — это nginx, второй сервер (web) — это node.js.
Я получаю 502 bad gateway, и запрос вообще не доходит до второго сервера — в его журналах запросов ничего нет.
Без ssl_verify_client
ответ 200 OK.
Сертификат клиента корректен: заголовки ответа содержат X-ssl_client_verify: SUCCESS
, так что, должно быть, что-то другое вызывает 502.
Логически это звучит как комбинация двух опций. Если ssl_client_verify возвращает SUCCESS, но запрос не отправляется на сервер, пока опция не будет удалена, это указывает на то, что две опции несовместимы?
Используются 2 конфигурационных файла:
default.conf:
upstream app_servers {
least_conn;
server web:80;
}
server {
listen 443 default_server ssl;
server_name _;
# production
ssl_certificate /etc/ssl/example.com/bundle.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
# поддержка взаимной двусторонней SSL
ssl_verify_client on;
ssl_client_certificate /etc/ssl/client/client.bundle.pem;
ssl_verify_depth 10;
ssl_protocols TLSv1.3;
client_max_body_size 5m;
}
example.com.conf:
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443;
server_name example.com;
location / {
proxy_redirect off;
proxy_pass http://app_servers;
# раскомментируйте, если требуется отслеживание ошибок
error_log traffic/err.log debug;
# проверьте результат проверки сертификата SSL клиента
add_header X-ssl_client_verify $ssl_client_verify always;
if ($ssl_client_verify != "SUCCESS") {
return 403;
}
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginxX-Proxy true;
proxy_set_header X-client-cert-verifiy $ssl_client_verify;
proxy_set_header X-sni $ssl_server_name;
proxy_set_header X-client-cert $ssl_client_raw_cert;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
proxy_no_cache $http_pragma $http_authorization;
}
}
Я уже много лет использую nginx в качестве LB с proxy_pass на других связанных сайтах без каких-либо проблем.
Ответ или решение
Да, использование параметров ssl_verify_client
и proxy_pass
одновременно в конфигурации Nginx может вызвать определенные проблемы, такие как ошибка 502 Bad Gateway, особенно если они неправильно настроены. Ваша ситуация действительно намекает на то, что они могут быть несовместимы, или, скорее, ваше конфигурационное окружение не полностью учитывает аспекты, связанные с аутентификацией по сертификату.
Анализ проблемы
Вы правильно отметили, что с включенным параметром ssl_verify_client
клиентский сертификат проверяется, и наличие заголовка X-ssl_client_verify: SUCCESS
свидетельствует о том, что клиентский сертификат действителен. Если исключить параметр ssl_verify_client
и сервер отвечает 200 OK, это может указывать на:
-
Проблемы с проксированием:
- Сервер, на который вы проксируете запросы (Node.js), может не быть настроен на прием определенных заголовков или типов данных от Nginx, в том числе тех, которые связаны с информацией о клиентском сертификате.
- Сервер может не ожидать, что клиентский сертификат будет передан, что может вызывать сбой в его обработке.
-
Процесс аутентификации:
- Когда
ssl_verify_client
включен, возможно, что некоторые дополнительные параметры, требуемые для корректной передачи информации или установленного окружения, не учитываются или отсутствуют при проксировании.
- Когда
Рекомендации по устранению проблемы
-
Проверка логов:
- Убедитесь, что логи ошибок включены и анализируйте их. В конфигурации вы указали
error_log traffic/err.log debug;
, что является хорошим шагом. Настройка уровня журналирования наdebug
поможет выявить, на каком этапе происходит сбой.
- Убедитесь, что логи ошибок включены и анализируйте их. В конфигурации вы указали
-
Настройка заголовков:
- Убедитесь, что все заголовки, связанные с клиентским сертификатом, корректно настройте и передавайте на сервер Node.js. Возможно, потребуется убедиться, что сервер правильно обрабатывает заголовки, такие как
X-client-cert
иX-client-cert-verify
.
- Убедитесь, что все заголовки, связанные с клиентским сертификатом, корректно настройте и передавайте на сервер Node.js. Возможно, потребуется убедиться, что сервер правильно обрабатывает заголовки, такие как
-
Отладка конфигурации Nginx:
-
Возможно, стоит рассмотреть использование секции
location
, чтобы обрабатывать запросы, требующие проверки клиентского сертификата, отдельно:location / { if ($ssl_client_verify != "SUCCESS") { return 403; } # проксируем только в случае успешной проверки сертификата proxy_pass http://app_servers; }
-
-
Тестирование с минимальными изменениями:
- Для диагностики попробуйте временно упростить конфигурацию, например, последовательно отключая все правила и заголовки, и наблюдайте, когда ошибка 502 исчезает. Это может помочь вам изолировать первоначальную причину проблемы.
-
Проверка совместимости с Node.js:
- Убедитесь, что сервер Node.js поддерживает и может обрабатывать входящие подтверждения клиентских сертификатов. Может потребоваться библиотека node.js, которая обрабатывает сертификаты корректно.
Заключение
Ваша конфигурация Nginx должна обеспечивать правильное взаимодействие между клиентом и сервером. Если происходит ошибка 502 Bad Gateway при использовании обеих опций ssl_verify_client
и proxy_pass
, наверняка стоит глубже исследовать журналы и параметры настройки. Убедитесь, что сервер Node.js также полностью готов обрабатывать запросы с клиентскими сертификатами и что заголовки, связанные с аутентификацией, передаются корректно. Процесс устранения неполадок может потребовать экспериментирования с конфигурацией и близкого взаимодействия с кодом сервера Node.js, чтобы найти оптимальное решение.