La negociación de SSL Handshake en Nginx es terriblemente lenta

17

Estoy usando Nginx como proxy para 4 instancias de apache. Mi problema es que la negociación de SSL lleva mucho tiempo (600 ms). Vea esto como un ejemplo: http://www.webpagetest.org/result/101020_8JXS/1/details/

Aquí está mi 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;

    }

}

La máquina es un VPS en Linode con 1 G de RAM. ¿Alguien puede decir por qué SSL Hand Shake está tomando años?

Paras Chopra
fuente

Respuestas:

11

Debe deshabilitar los cifrados "efímero diffie-hellman". Los navegadores no los usan de todos modos, pero openSSL lo hará cuando se use con herramientas como cURL o apachebench. Así que apuesto a que webpagetest.org los está utilizando.

Vea este hilo para más detalles.

Personalmente, uso esta configuración en nginx para forzar los cifrados SSL más rápidos pero aún seguros basados ​​en las preferencias del servidor, y no en los navegadores:

Actualización 2014-01-13: Este consejo ha cambiado debido a los recientes ataques contra RC4, las actualizaciones del navegador que protegen contra BEAST y la disponibilidad más generalizada de TLS v1.2 en clientes y servidores.

Actualizado 2015-10-16: configuración actual de nginx TLS 2015-10-16 según lo recomendado por CloudFlare . Verifique el enlace anterior para obtener actualizaciones, ya que TLSv1 probablemente se eliminará de la configuración recomendada en algún momento. La configuración actual deshabilita SSLv3 y RC4 de acuerdo con las mejores prácticas actuales y las últimas PCI-DSS a partir de esta fecha.

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;

Esto reemplaza el consejo anterior en esta respuesta, que se ha eliminado para evitar confusiones.

rmalayter
fuente
RC4 es inseguro y no es adecuado para su uso en TLS. "Si bien se sabe que el algoritmo RC4 tiene una variedad de debilidades criptográficas (ver [26] para una encuesta excelente), no se ha explorado previamente cómo pueden explotarse estas debilidades en el contexto de TLS. Aquí mostramos eso nuevo y recientemente los sesgos descubiertos en el flujo de claves RC4 crean serias vulnerabilidades en TLS cuando se utiliza RC4 como algoritmo de cifrado ". Consulte Sobre la seguridad de RC4 en TLS y WPA .
2
@noloader que el ataque Rc4 se anunció años después de mi publicación; Hasta hace muy poco, la mayoría de los criptógrafos recomendaban RC4 sobre AES debido al ataque BEAST contra TLS v1.0 y versiones anteriores. Ahora que la mayoría de los navegadores protegen contra BEAST del lado del cliente, y ha habido más ataques contra RC4, el consejo ha cambiado. Consulte esta publicación para conocer algunas buenas configuraciones de nginx para TLS v1.2: blog.cloudflare.com/staying-on-top-of-tls-attacks
rmalayter
¡Oh mi! Lo siento por eso. No pensé en consultar las fechas. Lo siento.
5

Es posible que no tenga una buena fuente de entropía. ¿Existe /dev/urandom? Si no, Nginx bloqueará la lectura /dev/random.

¿Cuál es el tamaño de tu llave? Más largo es más lento.

Trate straceing los procesos para ver lo que están haciendo.

Mark Wagner
fuente
+1 Parece una buena posibilidad ya que a menudo falta urandom en los VPS
Kyle Brandt
1

verifique que no esté esperando la resolución de DNS en alguna parte.

pjz
fuente
0

Cambio

ssl_protocols  SSLv2 SSLv3 TLSv1;

a

ssl_protocols  SSLv3 TLSv1 SSLv2;

Intenta protocolos en el orden en que se enumeran.

trineo
fuente
Realmente no ayudó. Ver webpagetest.org/result/101020_8KVR/1/details - la negociación todavía toma> 50% de todo el tiempo.
Paras Chopra
2
SSLv2 NO debe usarse, es inseguro. En el momento de este comentario, todos los principales navegadores deben ser compatibles con TLSv1, por lo que SSLv3 ya no será necesario. (idealmente debería ser TLSv1 TLSv1.1 TLSv1.2 hasta que la mayoría de los navegadores adopten 1.1).
KBeezie