SSL 클라이언트 인증서 인증으로 백엔드 할 Nginx 프록시 인증서로 인증하도록 구성되었습니다. 서버

두 개의 서버가 있으며 둘 다 nginx가 있습니다. 서버 A가 443을 청취 중이며 클라이언트 SSL 인증서로 인증하도록 구성되었습니다.

서버 B에는 nginx를 통해 서버 A와 통신해야하는 내부 프로세스가 있습니다.

서버 B에서 Nginx를 구성하여 8080 (모든 로컬 통신이므로 암호화 없음)과 server_ : 443에 대한 proxy_pass를 수신합니다.

문제는 어떻게 클라이언트 인증서를 주입합니까? 그렇게 할 proxy_xxxx 함수를 찾지 못했습니다.

socat을 사용하여 이에 상응하는 방법을 알고 있지만 nginx를 사용해야합니다.



답변

클라이언트 인증서 정보를 전달하는 것으로 충분합니까?

추가 할 수 있습니다

proxy_set_header X-SSL-CERT $ssl_client_escaped_cert;

인증서 정보는 X-SSL-Cert 헤더를 통해 서버 B에서 사용할 수 있습니다.


답변

분명히 이것은 당신이 찾고있는 것입니다 :
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;
    ...
}

답변

문제는 버전 의존적 인 것 같습니다. 우분투 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에서는 기본적으로 작동하지 않습니다. 아마도 힌트로만 사용되며 구성 파일로 사용되거나 다른 버전에 의존하지 않습니다.

SSL 및 자체 서명 클라이언트 인증서가 활성화 된 apache2 기반 백엔드 서버 A로 테스트하고 있습니다. Apache config SSLOptions는 다음과 같이 설정됩니다.

SSLOptions +ExportCertData +FakeBasicAuth + StdEnvVars

백엔드 측의 phpinfo () 스크립트가 서버 및 클라이언트 측 정보를 표시하므로 상황을 쉽게 디버깅 할 수 있습니다.

이것을 확인하기 위해 내가 사용한 :

https : // backend / test / phpinfo

브라우저에 SSL 인증서가 설치되어 있고 서버 인증서의 경우 SSL_SERVER_S_DN_CN 및 클라이언트 인증서의 경우 SSL_CLIENT_S_DN_CN과 같은 섹션이 있습니다.

첫 번째 시작으로 프론트 엔드 서버 B에서 nginx를 구성하기 위해 괄호 안에 부품을 채우십시오.

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


답변

nginx 및 SSL 클라이언트 인증서에 대한 깔끔한 기사가 있습니다. PHP는 FastCGI와 함께 PHP를 사용하지만 리버스 프록시 설정에 적용 할 수 있다고 생각합니다.

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