O nginx pode usar diferentes protocolos SSL em diferentes blocos de servidores?

6

Estou tentando configurar um nome de host para demonstrar uma configuração SSL insatisfatória e estou tendo alguns problemas. Eu posso especificar alguns conjuntos de codificação incorretos, mas o nginx parece ignorar a seleção de protocolo.

server {
    listen 443 spdy ssl;
    keepalive_timeout 70;
    server_name example.co.uk;
    client_max_body_size 10M;

    ssl_certificate /path/to/ssl.crt;
    ssl_certificate_key /path/to/ssl.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ...
}

server {
    listen 443 spdy ssl;
    keepalive_timeout 70;
    server_name weak.example.co.uk;
    client_max_body_size 10M;

    ssl_certificate /path/to/weakssl.crt;
    ssl_certificate_key /path/to/weakssl.key;
    ssl_protocols SSLv3;
    ...
}

O Nginx pode usar as diferentes suítes de criptografia que eu especifiquei, mas parece usar os protocolos do primeiro bloco de servidor em toda a placa, de modo que o weak.example.co.uk tenha o TLSv1 / 1.1 / 1.2 e nenhum suporte ao SSLv3.

É possível especificar diferentes protocolos para cada bloco de servidores?

    
por Scott Helme 10.09.2014 / 20:22

2 respostas

2

Isso parece ser um bug no nginx. Eu só tinha isso agora, demorei um pouco para descobrir isso.

Ele está sempre usando somente a diretiva ssl_protocols do primeiro bloco do servidor. No meu caso eu tenho muitos servidores virtuais rodando na mesma instância, então eu usei o comando nginx -T para exibir a configuração combinada completa para descobrir qual bloco de servidor era o "primeiro" desde que eu o separei em vários arquivos de configuração separados .

No momento da escrita estou tentando isso no Ubuntu 14.04.5 com nginx instalado a partir do ondrej/nginx PPA. Especificamente, estou executando o nginx 1.10.2 construído com o OpenSSL 1.0.2j.

Saída de nginx -V

nginx version: nginx/1.10.2
built with OpenSSL 1.0.2j  26 Sep 2016
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_spdy_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module --add-dynamic-module=/build/nginx-8xB1_y/nginx-1.10.2/debian/modules/nginx-auth-pam --add-dynamic-module=/build/nginx-8xB1_y/nginx-1.10.2/debian/modules/nginx-dav-ext-module --add-dynamic-module=/build/nginx-8xB1_y/nginx-1.10.2/debian/modules/nginx-echo --add-dynamic-module=/build/nginx-8xB1_y/nginx-1.10.2/debian/modules/nginx-upstream-fair --add-dynamic-module=/build/nginx-8xB1_y/nginx-1.10.2/debian/modules/ngx_http_substitutions_filter_module
    
por 22.01.2017 / 05:23
1
  1. Verifique se sua configuração está validada estaticamente com nginx -t
  2. Verifique se sua configuração é validada dinamicamente, monitorando um log de erros definido em main level ao emitir um recarregamento ( service nginx reload ou kill -SIGHUP <nginx master PID> )
  3. Crie um local de teste em cada servidor (veja abaixo)
  4. Verifique se o seu nginx é construído com a extensão SNI (normalmente sim, se você usar um pacote pré-criado)
  5. Verifique se o servidor certo está sendo usado: se a seleção do nome de domínio por meio do SNI falhar ou se o SNI não estiver disponível, o nginx retornará ao servidor padrão para exibir o conteúdo. O servidor padrão é, a menos que especificado de outra forma, o primeiro encontrado no arquivo de configuração.
  6. Certifique-se de que o cache do navegador esteja limpo (e que qualquer cache entre o servidor e o navegador seja atualizado / seja eliminado)

Se um certificado errado fosse apresentado (sem seleção de servidor errado ou SNI), você normalmente receberia um aviso de certificado, pois haveria uma incompatibilidade entre o nome de domínio solicitado e o definido para o certificado.

Isso exibirá o protocolo que está sendo usado pela conexão atual:

location /SSLProtocol {
    return 200 $ssl_protocol;
}
    
por 17.11.2014 / 10:42