Deaktivieren Sie TLS 1.0 in NGINX

22

Ich habe ein NGINX, das als Reverse-Proxy für unsere Sites fungiert, und es funktioniert sehr gut. Die Sites, die Notwendigkeit ssl folgte ich raymii.org sicher zu machen , wie stark haben eines SSLLabs wie möglich punkten. Einer der Standorte muss PCI-DSS-kompatibel sein, aber basierend auf dem neuesten TrustWave-Scan schlägt dieser jetzt fehl, da TLS 1.0 aktiviert ist.

Auf der http-Ebene in nginx.conf habe ich:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

Für den spezifischen Server habe ich:

ssl_protocols TLSv1.1 TLSv1.2;

Ich habe Chiffren geändert, Dinge von der http-Ebene auf jeden SSL-Standortserver verschoben, aber egal, was passiert, wenn ich ausgeführt werde:

openssl s_client -connect www.example.com:443 -tls1

Ich erhalte eine gültige Verbindung für TLS 1.0. SSLLabs setzt das Nginx-Setup für die Site als A, aber mit TLS 1.0. Ich glaube, dass der Rest meines Setups korrekt ist und TLS 1.0 nicht deaktiviert.

Gedanken darüber, was ich vermissen könnte?

openssl version -a
OpenSSL 1.0.1f 6 Jan 2014
built on: Thu Jun 11 15:28:12 UTC 2015
platform: debian-amd64

nginx -v
nginx version: nginx/1.8.0
Shawn C.
quelle
1
Beachten Sie, dass TLS 1.0 nicht vor dem 30. Juni 2016 entfernt werden muss.
Michael Hampton

Antworten:

12

Das Problem hierbei ist, dass der Server name indicationTeil der TLS-Aushandlung erfolgt, nachdem die Verbindung selbst ausgehandelt wurde. Das Protokoll wird während der Verbindungsaushandlung ausgehandelt.

Möglicherweise kann für diesen virtuellen Host kein TLS v1.0 erzwungen werden, wenn Sie diesen virtuellen Host für eine IP-Adresse auf dem Server konfigurieren, dem keine anderen virtuellen Hosts zugeordnet sind. Daher würde nginx anhand der IP-Adresse wissen, dass kein TLS v 1.0 erlaubt ist.

Tero Kilkanen
quelle
Vielen Dank. Ich gehe davon aus, dass wir im Moment keine freie IP haben, um das zu testen.
Shawn C.
1
Server Name Indicationist Teil des TLS ClientHello. Sie ist in der ersten vom Client gesendeten Nachricht enthalten und wird später nicht ausgehandelt. Es klingt eher so, als hätte Nginx einen Designfehler. Es hört sich so an, als würde es die Verbindung akzeptieren und dann an den virtuellen Host weiterleiten, ob es richtig oder falsch ist. Stattdessen sollte nginx den Servernamen analysieren, den virtuellen Host konsultieren und die Verbindung dann ablehnen, wenn die Anforderungen des virtuellen Hosts nicht erfüllt werden. Der Konstruktionsfehler ist wahrscheinlich CVE-gerecht, da TLS 1.0 zuweilen fraglich ist. Es ist eindeutig eine C & A-Verletzung unter bestimmten Umständen.
Danke für den Kommentar. Das ist interessant, wenn es sich wirklich um einen echten Konstruktionsfehler handelt.
Tero Kilkanen
1
Ist dies 2019 mit neueren Nginx-Versionen unverändert?
Robsch
18

Suchen Sie einen Serverblock, den Sie als "Standard" -ssl-Aushandlungsvorlage verwenden möchten. Finden Sie Ihre Hörlinie

server {
    ...
    listen 443 ssl;
    ssl_protocols TLSv1.1 TLSv1.2;
    ...
}

und default_serveram Ende der Zeile hinzufügen

server {
    ...
    listen 443 ssl default_server;
    ssl_protocols TLSv1.1 TLSv1.2;
    ...
}

Auf diese Weise kann Nginx bei der Aushandlung der zu verwendenden TLS-Version eine Konfiguration vornehmen. Der Nachteil ist, dass Sie nur einen Standardserver pro Port haben können. Es ist also kein Problem, einige virtuelle Domänen mit aktiviertem TLSv1 und andere mit deaktiviertem TLSv1 zu haben.

Thego Rilla
quelle
Bedeutet das, dass es nur einen einzigen Ort gibt, an dem ssl_protocolls eine Wirkung hat? In der Serverkonfiguration, die die default_server-Deklaration hat? Wenn diese Konfiguration während der Aushandlung verwendet wird, hat die Einstellung ssl_protocolls in einer anderen Konfiguration keine Auswirkung.
Robsch
4

Ich habe TLSv1 auf Nginx Version 1.8.1 deaktiviert. Sie müssen openssl auf die Versionen 1.0.1g oder 1.0.1h aktualisieren. Dann entfernen Sie einfach 'TLSv1' aus der ssl_protocols-Direktive:

ssl_protocols TLSv1.1 TLSv1.2

Überprüfen Sie dann die Verbindung über TLSv1 mit dem Befehl:

openssl s_client -tls1 -connect example.com:443 < /dev/null

Sie sollten so etwas bekommen:

CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1
    Cipher    : 0000
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    Start Time: 1474531027
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---
r0den
quelle
1
In der Regel können Benutzer die OpenSSL-Version nicht ersetzen, wenn sie sich in einer gehosteten Umgebung befinden. Der Server-Operator steuert die Serverkonfiguration. nicht der Website-Betreiber, der den virtuellen Server mietet.