Frage Deaktivieren Sie TLS 1.0 in NGINX


Ich habe eine NGINX, die als Reverse-Proxy für unsere Websites fungiert und sehr gut funktioniert. Für die Websites, die SSL benötigen, folgte ich raymii.org um sicher zu gehen, dass SSLLabs so stark wie möglich ist. Eine der Websites muss PCI DSS-konform sein, basiert jedoch auf dem neuesten TrustWave-Scan, da nun 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 die Verschlüsselungen geändert, Dinge aus der http-Ebene und zu jedem SSL-Site-Server verschoben, aber egal was passiert, wenn ich das ausführe:

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

Ich bekomme eine gültige Verbindung für TLS 1.0. SSLLabs legt das Nginx-Setup für die Site als ein EIN Aber mit TLS 1.0 glaube ich, dass der Rest meines Setups korrekt ist und TLS 1.0 nicht deaktiviert wird.

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

18
2017-07-08 15:32


Ursprung


Beachten Sie, dass TLS 1.0 nicht bis zum 30. Juni 2016 entfernt werden muss. - Michael Hampton♦


Antworten:


Das Problem hier ist, dass die Server name indication Ein Teil der TLS-Verhandlung wird ausgeführt, nachdem die Verbindung selbst ausgehandelt wurde. Und das Protokoll wird während der Verbindungsaushandlung ausgehandelt.

Möglicherweise können Sie TLS v1.0 für diesen virtuellen Host nicht erzwingen, 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 basierend auf der IP-Adresse wissen, dass kein TLS v 1.0 erlaubt ist.


10
2017-07-08 15:50



Vielen Dank. Ich gehe davon aus, dass wir keine freie IP im Moment haben, um das zu testen. - Shawn C.
Server Name Indication ist Teil des TLS ClientHello. Es ist in der ersten Nachricht vom Client gesendet und später nicht ausgehandelt. Es klingt eher wie Nginx einen Designfehler hat. Es klingt, als ob es die Verbindung akzeptiert und dann an den virtuellen Host weiterleitet, egal 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 Designfehler ist wahrscheinlich CVE wert, da TLS 1.0 manchmal fragwürdig ist. Es ist unter bestimmten Umständen eindeutig ein C & A-Verstoß. - jww
Danke für den Kommentar. Das ist interessant, wenn es wirklich ein echter Designfehler ist. - Tero Kilkanen


Suchen Sie einen Serverblock, den Sie als Ihre Standard-SSL-Verhandlungsvorlage verwenden möchten. Finde deine Listenzeile

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

und hinzufügen default_server bis zum Ende der Linie

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

Dadurch kann nginx eine Konfiguration haben, wenn verhandelt wird, welche TLS-Version verwendet werden soll. Der Nachteil ist, dass Sie nur einen Standardserver pro Port haben können. Einige virtuelle Domains mit aktiviertem TLSv1 und anderen mit deaktivierten Domains zu haben, ist also ein Nein.


12
2017-10-05 18:19





Wenn es noch wichtig ist, habe ich TLSv1 auf nginx Version 1.8.1 deaktiviert. Sie müssen openssl auf 1.0.1g oder 1.0.1h Versionen aktualisieren. Dann einfach "TLSv1" aus der ssl_protocols-Direktive entfernen:

ssl_protocols TLSv1.1 TLSv1.2

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

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

Du solltest 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)
---

4
2017-09-22 08:29



Benutzer können die Version von OpenSSL normalerweise 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. - jww