Proxy Nginx para back-end com autenticação de certificado de cliente SSL

7

Eu tenho dois servidores, ambos com nginx. O servidor A está escutando 443 e está configurado para autenticar com um certificado SSL de cliente.

O servidor B tem um processo interno que precisa se comunicar com o servidor A através do nginx.

Gostaria de configurar o Nginx no servidor B que escutará o 8080 (sem criptografia, já que é tudo comunicação local) e proxy_pass para o Servidor A: 443.

A pergunta é como injetar um certificado de cliente? Eu não encontrei nenhuma função proxy_xxxx que faria isso.

Eu sei como fazer um equivalente a isso com o socat, mas minha exigência é usar o nginx.

    
por Bastien974 20.08.2014 / 20:58

5 respostas

9

É suficiente ter os detalhes do certificado do cliente transmitidos?

Você pode adicionar

proxy_set_header X-SSL-CERT $ssl_client_escaped_cert;

para a sua configuração e, em seguida, as informações do certificado estão disponíveis para o servidor B através de um cabeçalho X-SSL-Cert.

    
por 16.09.2014 / 23:05
3

Aparentemente, é isso que você está procurando: link Disponível desde a versão 1.7.8.

location / {
    ...
    proxy_pass     the_other_nginx;
    proxy_ssl_certificate  the_certificate.pem;
    ...
}
    
por 19.03.2015 / 16:22
2

O problema parece ser amplamente dependente da versão. No Ubuntu 14.04 LTS, o nginx padrão é um 1.4 desatualizado. Primeiro você precisa instalar uma versão baseada em PPA

link

mostra como fazer isso com:

sudo add-apt-repository ppa:nginx/stable
sudo aptitude safe-upgrade

você deve acabar com:

nginx -v
nginx version: nginx/1.8.0

A configuração de @ xatr0z responde link apontando para link não funciona:

proposta não funcional

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;
    }
}

não funciona fora da caixa com 1.8.0. Provavelmente é apenas uma dica e não deve ser usado como arquivo de configuração como tal ou depende de outra versão.

Estou testando com um servidor backend baseado em apache2, com SSL e certificados de cliente autoassinados habilitados. As configurações SSLOptions do Apache estão definidas para:

SSLOptions +ExportCertData +FakeBasicAuth + StdEnvVars

Isso facilita a depuração da situação, pois um script phpinfo () no backend mostrará as informações do servidor e do cliente.

Para verificar isso eu usei:

link

com o certificado SSL instalado no navegador e recebo seções como: SSL_SERVER_S_DN_CN para o certificado do servidor e SSL_CLIENT_S_DN_CN para o certificado do cliente.

Como primeiro começo eu usei (preencha as partes entre parênteses) para configurar o nginx no servidor frontend 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;
  }
}

descomentando a parte específica do SSL Client Certificate apenas para verificar se o próprio proxy reverso funciona.

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

Agora, o link funciona O

SSL_SERVER_S_DN_CN para o certificado do servidor é exibido e SSL_CLIENT_S_DN_CN para o certificado de cliente não é (ainda) exibido

Agora, depois de descomentar:

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;
  }
}

e verificando / reiniciando

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

link funciona e

SSL_SERVER_S_DN_CN para o certificado do servidor é exibido e SSL_CLIENT_S_DN_CN para o certificado de cliente é exibido

agora temos as coisas funcionando conforme solicitado.

Por favor, observe o bug link

    
por 05.01.2016 / 11:41
0

Existe um artigo bastante interessante sobre os certificados de cliente nginx e SSL; ele usa PHP com FastCGI como exemplo, mas acho que você pode adaptar isso a uma configuração de proxy reverso:

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;
    }
}

Fonte link

    
por 12.10.2014 / 17:18
0

Parece que este módulo SEnginx é o que você está procurando: link

    
por 12.10.2014 / 19:16