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

Прокси-сервер Nginx для серверной части с аутентификацией сертификата клиента SSL

У меня два сервера, на обоих есть 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