У меня два сервера, на обоих есть nginx. Сервер A прослушивает 443 и настроен для аутентификации с помощью клиентского SSL-сертификата.
Сервер B имеет внутренний процесс, который должен взаимодействовать с сервером A через nginx.
Я хотел бы настроить Nginx на сервере B, который будет прослушивать 8080 (без шифрования, поскольку это все локальное взаимодействие) и proxy_pass для ServerA: 443.
Вопрос в том, как мне ввести сертификат клиента? Я не нашел ни одной функции proxy_xxxx, которая бы это сделала.
Я знаю, как сделать аналог с socat, но мое требование - использовать nginx.
Достаточно ли передать данные сертификата клиента?
Можете добавить
proxy_set_header X-SSL-CERT $ssl_client_escaped_cert;
в вашу конфигурацию, а затем информация о сертификате будет доступна серверу B через заголовок X-SSL-Cert.
Проблема, похоже, во многом зависит от версии. В Ubuntu 14.04 LTS по умолчанию используется устаревший nginx 1.4. Сначала вам нужно установить версию на основе PPA
https://leftshift.io/upgrading-nginx-to-the-latest-version-on-ubuntu-servers
показывает, как это сделать с помощью:
sudo add-apt-repository ppa:nginx/stable
sudo aptitude safe-upgrade
у вас должно получиться:
nginx -v
nginx version: nginx/1.8.0
Конфигурация из ответа @ xatr0z https://serverfault.com/a/636455/162693 указывает на http://www.senginx.org/en/index.php/Proxy_HTTPS_Client_Certificate не работает:
нерабочее предложение
backend {
server some-ip:443;
}
server {
listen 80;
location / {
proxy_ssl_certificate certs/client.crt;
proxy_ssl_certificate_key certs/client.key;
proxy_pass https://backend;
}
}
из коробки не работает с 1.8.0. Вероятно, это только подсказка, а не для использования в качестве файла конфигурации как такового или зависит от другой версии.
Я тестирую сервер A на основе apache2 с включенными SSL и самозаверяющими сертификатами клиента. Параметры SSL конфигурации Apache установлены на:
SSLOptions +ExportCertData +FakeBasicAuth + StdEnvVars
Это упрощает отладку ситуации, поскольку скрипт phpinfo () на стороне сервера будет отображать информацию на стороне сервера и клиента.
Чтобы проверить это, я использовал:
https: // бэкэнд / тест / phpinfo
с сертификатом SSL, установленным в браузере, и я получаю такие разделы, как: SSL_SERVER_S_DN_CN для сертификата сервера и SSL_CLIENT_S_DN_CN для сертификата клиента.
В качестве первого запуска я использовал (заполните части в скобках) для настройки nginx на внешнем сервере B:
server {
listen 8080;
server_name <frontend>;
location / {
proxy_buffering off;
proxy_pass https://<backend>;
#proxy_ssl_certificate certs/<SSL Client Certificate>.crt;
#proxy_ssl_certificate_key certs/<SSL Client Certificate>.key;
}
}
uncomenting часть SSL-сертификата клиента, чтобы проверить, работает ли сам обратный прокси.
nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
service nginx restart
nginx stop/waiting
nginx start/running, process 8931
Сейчас http: // интерфейс: 8080 / test / phpinfo.php работает
Отображается SSL_SERVER_S_DN_CN для сертификата сервера и SSL_CLIENT_S_DN_CN для сертификата клиента не отображается (пока)
Теперь после раскомментирования:
server {
listen 8080;
server_name <frontend>;
location / {
proxy_buffering off;
proxy_pass https://<backend>;
proxy_ssl_certificate certs/<SSL Client Certificate>.crt;
proxy_ssl_certificate_key certs/<SSL Client Certificate>.key;
}
}
и проверка / перезапуск
nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
service nginx restart
nginx stop/waiting
nginx start/running, process 8931
http: // интерфейс: 8080 / test / phpinfo.php работает и
Отображается SSL_SERVER_S_DN_CN для сертификата сервера и SSL_CLIENT_S_DN_CN для сертификата клиента отображается
так что теперь все работает так, как и просили.
Обратите внимание на ошибку https://trac.nginx.org/nginx/ticket/872#ticket
По всей видимости, это то, что вы ищете: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_certificate Доступно с версии 1.7.8.
location / {
...
proxy_pass the_other_nginx;
proxy_ssl_certificate the_certificate.pem;
...
}
Есть довольно интересная статья о клиентских сертификатах nginx и SSL; он использует PHP с FastCGI в качестве примера, но я думаю, вы можете адаптировать это к настройке обратного прокси:
server {
listen 443;
ssl on;
server_name example.com;
ssl_certificate /etc/nginx/certs/server.crt;
ssl_certificate_key /etc/nginx/certs/server.key;
ssl_client_certificate /etc/nginx/certs/ca.crt;
ssl_verify_client optional;
location / {
root /var/www/example.com/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /var/www/example.com/lib/Request.class.php;
fastcgi_param VERIFIED $ssl_client_verify;
fastcgi_param DN $ssl_client_s_dn;
include fastcgi_params;
}
}
Источник http://nategood.com/client-side-certificate-authentication-in-ngi