objetivo

Aqui vou mostrar com configurar o NGINX para que ele obrigatóriamente exija um certificado no navegador do usuário para ele acessar determinado site ou área do site, pode considerar como autenticação por certificado se preferir.

configuração do nginx

abaixo a configuração normal do nginx apontando para o apache2 que atende em HTTP puro.

server {
        listen 80;
        server_name empresa.br;
        access_log /var/log/nginx/empresa.br-access.log;
        error_log /var/log/nginx/empresa.br-error.log;

        location / {
            proxy_read_timeout 120;
            proxy_connect_timeout 120;
            if ($request_uri ~* "\.(swf|ico|css|js|gif|jpe?g|png|html?)(\?.+)?$") {
                expires 2M;
                break;
            }
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
            proxy_pass http://empresa.br:8080/;
            allow 172.16.0.0/16;
            allow 192.168.0.0/23;
            allow 10.0.0.0/8;
            deny all;
        }

}

Aqui a configuração do acesso seguro com exigência de certificado instalado no navegador.

server {
        listen 443;
        server_name empresa.br;
        ssl                  on;
        ssl_certificate      /etc/sslCA/empresa-cert.pem;
        ssl_certificate_key  /etc/sslCA/empresa-key.pem;
    
        ssl_client_certificate /etc/sslCA/cacert.pem;
        ssl_verify_client on;
        ssl_verify_depth 1;

        location / {
            proxy_read_timeout 120;
            proxy_connect_timeout 120;
            if ($request_uri ~* "\.(swf|ico|css|js|gif|jpe?g|png)(\?.+)?$") {  
              expires 2M;
                break;
            }
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://empresa.br:8080/;

        }

}

A diretivas abaixo são o segredo para exigir o certificado neste cenário:

ssl_client_certificate /etc/sslCA/cacert.pem;
ssl_verify_client on; 
ssl_verify_depth 1;

A primeira diretiva especifica o caminho para o certificado CA que será utilizado para verificar se o certificado instalado do navegador é válido.

A segundo diretiva especifica que é obrigatório ter o certificado instalado no navegador.

A terceira diretiva define o quão profundo deverá ser a checagem na cadeia de certificados para verificar a autenticidade do certificado instalado no navegador, aqui especificamos apenas o 1o nível.

instalando certificados no navegador

veja como gerar certificados pkcs12 na wikipage criando raiz certificadora

após gerar o certificado instale em seu navegador.

quando entrar na página pela primeira, vez será solicitada a senha do certificado, isto só ocorre uma única vez.

referências



nginx_autenticacao_via_certificados_digitais.txt · Last modified: 2011/01/02 20:08 by gutocarvalho
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0