Проблема, по-видимому, в значительной степени зависит от версии. В 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;
}
}
откомментируйте конкретную часть 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: // frontend: 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: // frontend: 8080 / test / phpinfo.php работает и
SSL_SERVER_S_DN_CN для сертификата сервера отображается и SSL_CLIENT_S_DN_CN для сертификата клиента отображается
так что теперь у нас все работает так, как просили.
Обратите внимание на ошибку https://trac.nginx.org/nginx/ticket/872#ticket