Wyłącz TLS 1.0 w NGINX

22

Mam NGINX działający jako odwrotny serwer proxy dla naszych witryn i działa bardzo dobrze. W przypadku witryn, które potrzebują ssl, śledziłem raymii.org, aby upewnić się, że uzyskałem jak najlepszy wynik SSLLabs. Jedna z witryn musi być zgodna ze standardem PCI DSS, ale w oparciu o najnowsze skanowanie TrustWave kończy się niepowodzeniem z powodu włączenia TLS 1.0.

Na poziomie http w nginx.conf mam:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

Dla konkretnego serwera mam:

ssl_protocols TLSv1.1 TLSv1.2;

Zmieniłem szyfry, przeniosłem rzeczy z poziomu http i na każdy serwer strony ssl, ale bez względu na to, kiedy uruchamiam:

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

Otrzymuję prawidłowe połączenie dla TLS 1.0. SSLLabs ustawia konfigurację nginx dla strony jako A, ale z TLS 1.0, więc uważam, że reszta mojej konfiguracji jest poprawna, po prostu nie wyłączy TLS 1.0.

Myśli o tym, czego mogłem przegapić?

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.
źródło
1
Pamiętaj, że usunięcie TLS 1.0 nie jest obowiązkowe do 30 czerwca 2016 r.
Michael Hampton

Odpowiedzi:

12

Problem polega na tym, że Server name indicationczęść negocjacji TLS odbywa się po wynegocjowaniu samego połączenia. Protokół jest negocjowany podczas negocjacji połączenia.

Może być możliwe wymuszenie braku TLS 1.0 dla tego wirtualnego hosta, jeśli skonfigurujesz tego wirtualnego hosta na adres IP na serwerze, z którym nie są powiązane żadne inne wirtualne hosty. Dlatego nginx wiedziałby na podstawie adresu IP, że TLS v 1.0 nie jest dozwolone.

Tero Kilkanen
źródło
Dzięki. Nie zakładam, aby to obejść, ponieważ w tej chwili nie mamy wolnego adresu IP, aby to przetestować.
Shawn C.,
1
Server Name Indicationjest częścią TLS ClientHello. Jest w pierwszej wiadomości wysłanej przez klienta i nie jest negocjowana później. Brzmi bardziej jak Nginx ma wadę projektową. wygląda na to, że akceptuje połączenie, a następnie przesyła je do hosta wirtualnego, czy jest poprawny, czy zły. Zamiast tego nginx powinien przeanalizować nazwę serwera, skonsultować się z wirtualnym hostem, a następnie odrzucić połączenie, jeśli nie spełnia ono wymagań wirtualnego hosta. Wada projektowa jest prawdopodobnie warta CVE, ponieważ TLS 1.0 jest czasem wątpliwy. Jest to w oczywisty sposób naruszenie C&A.
Dziękuję za komentarz. Jest to interesujące, jeśli naprawdę jest to prawdziwa wada projektowa.
Tero Kilkanen
1
Czy to się nie zmieniło w 2019 r. W przypadku nowszych wersji Nginx?
robsch
18

Znajdź blok serwera, którego chcesz użyć jako „domyślnego” szablonu negocjacji ssl. Znajdź swoją linię odsłuchu

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

i dodaj default_serverna końcu linii

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

Dzięki temu nginx może mieć konfigurację podczas negocjowania, której wersji TLS użyć. Minusem jest to, że możesz mieć tylko jeden domyślny serwer na port. Więc posiadanie niektórych domen wirtualnych z włączoną TLSv1, a inne z wyłączoną, nie jest niczym nowym.

Thego Rilla
źródło
Czy to oznacza, że ​​istnieje tylko jedno miejsce, w którym działa ssl_protocolls? Czy w konfiguracji serwera, która ma deklarację default_server? Gdy ta konfiguracja jest używana podczas negocjacji, ustawienie ssl_protocolls w innej konfiguracji nie ma wpływu?
robsch
4

Wyłączyłem TLSv1 w wersji 1.8.1 Nginx. Musisz zaktualizować openssl do wersji 1.0.1g lub 1.0.1h. Następnie po prostu usuń „TLSv1” z dyrektywy ssl_protocols:

ssl_protocols TLSv1.1 TLSv1.2

Następnie sprawdź połączenie za pomocą TLSv1 za pomocą polecenia:

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

Powinieneś dostać coś takiego:

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
źródło
1
Ludzie zwykle nie mogą zastąpić wersji OpenSSL, gdy znajdują się w środowisku hostowanym. Operator serwera kontroluje konfigurację serwera; nie operator strony internetowej, który wynajmuje serwer wirtualny.