SSL-Handshake-Aushandlung auf Nginx schrecklich langsam


17

Ich verwende Nginx als Proxy für 4 Apache-Instanzen. Mein Problem ist, dass die SSL-Aushandlung viel Zeit in Anspruch nimmt (600 ms). Beispiel: http://www.webpagetest.org/result/101020_8JXS/1/details/

Hier ist mein 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;

    }

}

Die Maschine ist eine VPS auf Linode mit 1 G RAM. Kann jemand bitte erklären, warum SSL-Handerschütterung Alter nimmt?

Antworten:


11

Sie müssen "ephemere Diffie-Hellman" -Verschlüsselungen deaktivieren. Browser verwenden sie sowieso nicht, aber openSSL wird verwendet, wenn Tools wie cURL oder apachebench verwendet werden. Ich wette also, dass webpagetest.org sie verwendet.

Weitere Informationen finden Sie in diesem Thread .

Ich persönlich verwende diese Einstellungen in nginx, um die schnellsten, aber immer noch sicheren SSL-Verschlüsselungen zu erzwingen, basierend auf den Servereinstellungen und nicht auf den Browsern:

Update 2014-01-13: Dieser Hinweis wurde geändert, da in letzter Zeit Angriffe auf RC4, Browser-Updates, die vor BEAST schützen, und TLS 1.2 auf Clients und Servern häufiger verfügbar sind.

Aktualisiert am 16.10.2015: Aktuelle Nginx-TLS-Einstellungen am 16.10.2015, wie von CloudFlare empfohlen . Bitte überprüfen Sie den vorherigen Link auf Aktualisierungen, da TLSv1 wahrscheinlich irgendwann aus der empfohlenen Konfiguration entfernt wird. Mit den aktuellen Einstellungen werden SSLv3 und RC4 gemäß den aktuellen Best Practices und dem neuesten PCI-DSS ab diesem Datum deaktiviert.

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;

Dies ersetzt die früheren Hinweise in dieser Antwort, die entfernt wurden, um Verwirrung zu vermeiden.


RC4 ist unsicher und für die Verwendung in TLS nicht geeignet. "Obwohl bekannt ist, dass der RC4-Algorithmus eine Vielzahl von kryptografischen Schwachstellen aufweist (siehe [26] für eine hervorragende Übersicht), wurde bisher nicht untersucht, wie diese Schwachstellen im Zusammenhang mit TLS ausgenutzt werden können. Hier zeigen wir dies neu und kürzlich Entdeckte Verzerrungen im RC4-Keystream führen zu schwerwiegenden Sicherheitslücken in TLS, wenn RC4 als Verschlüsselungsalgorithmus verwendet wird. " Siehe Zur Sicherheit von RC4 in TLS und WPA .

2
@noloader, dass der Rc4-Angriff Jahre nach meinem Post angekündigt wurde; Bis vor kurzem empfahlen die meisten Kryptografen RC4 gegenüber AES wegen des BEAST-Angriffs gegen TLS v1.0 und früher. Jetzt, da die meisten Browser vor BEAST-Clients schützen und es weitere Angriffe gegen RC4 gab, hat sich der Rat geändert. In diesem Beitrag finden Sie einige gute Nginx-Einstellungen für TLS v1.2: blog.cloudflare.com/staying-on-top-of-tls-attacks
rmalayter

Oh mein! Das tut mir leid. Ich habe nicht daran gedacht, die Daten zu überprüfen. Es tut uns leid.

5

Möglicherweise haben Sie keine gute Entropiequelle. Gibt /dev/urandomes Wenn nicht, blockiert Nginx das Lesen /dev/random.

Was ist die Größe Ihres Schlüssels? Länger ist langsamer.

Probieren straceSie die Prozesse aus, um zu sehen, was sie tun.


+1 Scheint eine gute Möglichkeit zu sein, da auf VPSs oftmals ein Zufall fehlt
Kyle Brandt

1

Stellen Sie sicher, dass Sie nicht irgendwo auf die DNS-Auflösung warten.


0

Veränderung

ssl_protocols  SSLv2 SSLv3 TLSv1;

zu

ssl_protocols  SSLv3 TLSv1 SSLv2;

Versucht die Protokolle in der angegebenen Reihenfolge.


Hat nicht wirklich geholfen. Siehe webpagetest.org/result/101020_8KVR/1/details - Verhandlungen dauern immer noch> 50% der gesamten Zeit.
Paras Chopra

2
SSLv2 sollte NICHT verwendet werden, es ist unsicher. Zum Zeitpunkt dieses Kommentars sollten alle gängigen Browser TLSv1 unterstützen, sodass SSLv3 ebenfalls nicht mehr benötigt wird. (Idealerweise sollte es TLSv1 TLSv1.1 TLSv1.2 sein, bis die meisten Browser 1.1 übernehmen.)
KBeezie
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.