Negociação de handshake SSL no Nginx terrivelmente lenta

17

Estou usando o Nginx como um proxy para 4 instâncias apache. Meu problema é que a negociação de SSL leva muito tempo (600 ms). Veja isso como um exemplo: http://www.webpagetest.org/result/101020_8JXS/1/details/

Aqui está o meu Nginx Conf:

user www-data;
worker_processes  4;


events {
    worker_connections 2048;
    use epoll;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    access_log  /var/log/nginx/access.log;
    sendfile        on;
    keepalive_timeout  0;
    tcp_nodelay        on;
    gzip  on;
    gzip_proxied any;
    server_names_hash_bucket_size 128;


}

upstream abc {
     server 1.1.1.1 weight=1;
     server 1.1.1.2 weight=1;
     server 1.1.1.3 weight=1;


 }


server {
    listen   443;
    server_name  blah;

    keepalive_timeout 5;

    ssl  on;
    ssl_certificate  /blah.crt;
    ssl_certificate_key  /blah.key;
    ssl_session_cache  shared:SSL:10m;
    ssl_session_timeout  5m;
    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers   on;

    location / { proxy_pass http://abc;

                 proxy_set_header X-Real-IP  $remote_addr;
                 proxy_set_header Host $host;
                 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }

}

A máquina é um VPS no Linode com 1 G de RAM. Alguém pode dizer por que o SSL Hand shake está demorando?

Paras Chopra
fonte

Respostas:

11

Você precisa desativar as cifras "efêmeras do homem-inferno". Os navegadores não os usam de qualquer maneira, mas o openSSL, quando usado com ferramentas como cURL ou apachebench. Então, estou apostando que o webpagetest.org os está usando.

Veja este tópico para mais detalhes.

Eu pessoalmente uso essas configurações no nginx para forçar as cifras SSL mais rápidas, mas ainda seguras, com base nas preferências do servidor, e não nos navegadores:

Atualização 2014-01-13: esse conselho mudou devido a ataques recentes ao RC4, atualizações de navegador que protegem contra o BEAST e a disponibilidade mais ampla do TLS v1.2 em clientes e servidores.

Atualizado 16/10/2015: configurações atuais do nginx TLS 16/10/2015, conforme recomendado pelo CloudFlare . Verifique o link anterior para atualizações, pois o TLSv1 provavelmente será removido da configuração recomendada em algum momento. As configurações atuais desativam o SSLv3 e o RC4 de acordo com as práticas recomendadas atuais e o PCI-DSS mais recente a partir desta data.

ssl_protocols               TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers                 EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers   on;

Isso substitui o conselho anterior nesta resposta, que foi removido para evitar confusões.

rmalayter
fonte
RC4 é inseguro e não é adequado para uso em TLS. "Embora se saiba que o algoritmo RC4 possui uma variedade de deficiências criptográficas (consulte [26] para uma excelente pesquisa), ainda não foi explorado anteriormente como essas fraquezas podem ser exploradas no contexto do TLS. Aqui mostramos que novos e recentes vieses descobertos no fluxo de chaves do RC4 criam sérias vulnerabilidades no TLS ao usar o RC4 como seu algoritmo de criptografia ". Consulte Sobre a segurança do RC4 no TLS e WPA .
2
@noloader que o ataque Rc4 foi anunciado anos depois do meu post; até muito recentemente, a maioria dos criptografadores recomendava o RC4 sobre o AES por causa do ataque do BEAST contra o TLS v1.0 e versões anteriores. Agora que a maioria dos navegadores protege contra o BEAST do lado do cliente e houve mais ataques contra o RC4, o conselho mudou. Veja este post para algumas boas configurações nginx para TLS v1.2: blog.cloudflare.com/staying-on-top-of-tls-attacks
rmalayter
Oh meu! Me desculpe por isso. Não pensei em verificar as datas. Desculpe.
5

Você pode não ter uma boa fonte de entropia. Existe /dev/urandom? Caso contrário, o Nginx bloqueará a leitura /dev/random.

Qual é o tamanho da sua chave? Mais tempo é mais lento.

Tente straceos processos para ver o que eles estão fazendo.

Mark Wagner
fonte
+1 Parece uma boa possibilidade, já que o urandom geralmente está ausente nos VPSs
Kyle Brandt
1

verifique se você não está esperando a resolução do DNS em algum lugar.

pjz
fonte
0

mudança

ssl_protocols  SSLv2 SSLv3 TLSv1;

para

ssl_protocols  SSLv3 TLSv1 SSLv2;

Tenta protocolos na ordem em que estão listados.

trenó
fonte
Realmente não ajudou. Consulte webpagetest.org/result/101020_8KVR/1/details - a negociação ainda leva> 50% do tempo todo.
Paras Chopra
2
O SSLv2 NÃO deve ser usado, é inseguro. No momento deste comentário, todos os principais navegadores deveriam suportar TLSv1, para que o SSLv3 não fosse mais necessário. (idealmente, deve ser TLSv1 TLSv1.1 TLSv1.2 até que a maioria dos navegadores adote 1.1).
precisa