NGINX: Como configurar a autenticação mútua para o TCP Upstream?

2

O recurso especial que me interessa sobre terminação SSL para o TCP Upstream. Estou avaliando tanto o NGINX Open Source quanto o NGINX Plus.

Temos um aplicativo que aceita mensagens (TCP) sobre TLS de clientes. Com o NGINX, quero finalizar o TLS no NGINX e, em seguida, o NGINX encaminhará os pacotes decriptografados para o aplicativo. Observe que meu aplicativo NÃO recebe mensagens por HTTP, mas por TCP (por isso, módulos relacionados a HTTP (S) não são válidos para meu caso de uso).

Cliente (s) - (TLS) - > NGINX - (descriptografado) - > Aplicação

Configurei o NGINX para balanceamento de carga TCP seguindo este documento (não SSL). Para isso eu tenho que construir o código fonte com os dois módulos seguintes:

  1. ngx_stream_core_module
  2. ngx_stream_ssl_module

Agora, desejo ativar a autenticação mútua com SSL entre o NGINX e os clientes. Estou vendo esta documentação que fala sobre a autenticação do lado do servidor (servidor de verificação do cliente certificado), mas não consigo descobrir as etapas para configurar a autenticação mútua (cliente e servidor verificando os certificados uns dos outros). Você poderia por favor me ajudar lá? No "ngx_stream_ssl_module" não encontro nenhuma opção para mencionar o certificado do cliente.

A seguir está o conteúdo do meu nginx.conf:

stream {
      server {
        listen *:5222 ssl;
        proxy_pass backend;
        ssl_certificate      /usr/local/nginx/certs/server.crt;
        ssl_certificate_key  /usr/local/nginx/certs/server.key;
        ssl_protocols         SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers           HIGH:!aNULL:!MD5;
        ssl_session_cache     shared:SSL:20m;
        ssl_session_timeout   4h;
        ssl_handshake_timeout 30s;
      }

      upstream backend {
        server 0.0.0.0:5223;
      }
}

Além disso, desejo permitir (handshake SSL) somente se o cliente tiver uma identidade específica (pode ser baseada no identificador do cliente / nome exclusivo). Existe alguma maneira de fazer isso usando NGINX ou NGINX Plus?

Qualquer outra sugestão será apreciada.

    
por Arnab Biswas 04.03.2016 / 08:38

2 respostas

2

Parece que o módulo ngx_stream_ssl_module não suporta esta diretiva ssl_client_certificate , ssl_verify_client

stream {
          server {
            listen *:5222 ssl;
            proxy_pass backend;
            ssl_certificate      /usr/local/nginx/certs/server.crt; # Can Include the Chain
            ssl_certificate_key  /usr/local/nginx/certs/server.key;
            ssl_protocols         TLSv1 TLSv1.1 TLSv1.2; # Removed SSLv3
            ssl_ciphers           HIGH:!aNULL:!MD5;
            ssl_session_cache     shared:SSL:20m;
            ssl_session_timeout   4h;
            ssl_handshake_timeout 30s;

            ssl_client_certificate  /usr/local/nginx/certs/ca.chain.cert.pem;
            ssl_verify_client on;
            ssl_verify_depth 2;
          }

          upstream backend {
            server 0.0.0.0:5223;
          }
    }

    
por 04.03.2016 / 10:26
1
 server {
    listen      80;
    server_name www.example.com;
    ...

    location /upstream {
        proxy_pass                    https://backend.example.com;
        proxy_ssl_certificate         /etc/nginx/client.pem;
        proxy_ssl_certificate_key     /etc/nginx/client.key
        proxy_ssl_protocols           TLSv1 TLSv1.1 TLSv1.2;
        proxy_ssl_ciphers             HIGH:!aNULL:!MD5;
        proxy_ssl_trusted_certificate /etc/nginx/trusted_ca_cert.crt;

        proxy_ssl_verify        on;
        proxy_ssl_verify_depth  2;
        proxy_ssl_session_reuse on;
    }
}

Se você usar um certificado autoassinado, inclua o arquivo CA: proxy_ssl_trusted_certificate .

    
por 28.12.2016 / 03:38

Tags