it-swarm.dev

Wyłącz TLS 1.0 w NGINX

Mam NGINX działający jako odwrotny serwer proxy dla naszych witryn i działa bardzo dobrze. W przypadku witryn, które wymagają ssl, śledziłem raymii.org , aby upewnić się, że uzyskasz jak najwyższy 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 umieszcza konfigurację nginx dla strony jako [~ # ~] a [~ # ~] , ale z TLS 1.0, więc wierzę, że reszta mojego konfiguracja jest prawidłowa, 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
24
Shawn C.

Problem polega na tym, że Server name indication część 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.

12
Tero Kilkanen

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_server do końca linii

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

Dzięki temu nginx może mieć konfigurację podczas negocjacji, 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.

18
Thego Rilla

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)
---
4
r0den