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
Odpowiedzi:
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.
źródło
Server Name Indication
jest częścią TLSClientHello
. 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.Znajdź blok serwera, którego chcesz użyć jako „domyślnego” szablonu negocjacji ssl. Znajdź swoją linię odsłuchu
i dodaj
default_server
na końcu liniiDzię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.
źródło
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:
Następnie sprawdź połączenie za pomocą TLSv1 za pomocą polecenia:
Powinieneś dostać coś takiego:
źródło