Wczoraj gdy pisałem Wam o uruchomieniu publicznej bety Let’s Encrypt zdałem sobie sprawę, że nie opisałem Wam jeszcze moim zdaniem najlepszego sposobu na konfigurację SSL w nginx. Tym bardziej, że to podstawa jeśli chcemy móc w praktyce korzystać z HTTP/2.
Najważniejsza sprawa. Skąd mamy wiedzieć, że nasza konfiguracja dla https:// jest poprawna, bezpieczna i najlepsza? Domyślna konfiguracja nginx jest tylko ciut bezpieczna. Dlatego na wstępie zawsze korzystam do weryfikacji z produktu firmy Qualys – SSL Server Test. Szybko, prosto i online.
Najlepszą ocenę jaką możemy uzyskać to A+. Trzeba „tylko” poświęcić 2 stare rozwiązania:
- IE 6 / XP (Protocol or cipher suite mismatch)
- Java 6u45 (Client does not support DH parameters > 1024 bits)
Obecnie blog, na którym właśnie jesteście osiąga wynik A+. I poniżej przedstawię Wam, jak sami możecie to osiągnąć.
Poniżej widzicie fragment konfiguracji vhosta odpowiedzialnego za matipl.pl:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
server { listen 46.29.19.104:443 http2; server_name matipl.pl; ssl on; ssl_certificate ssl/2015/matipl.pl.chain.crt; ssl_certificate_key ssl/2015/matipl.pl.key; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; ssl_session_timeout 5m; ssl_session_cache shared:NginxCache123:50m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS'; ssl_prefer_server_ciphers on; ssl_dhparam ssl/dhparam.pem; ssl_stapling on; resolver 208.67.220.220; ssl_stapling_verify on; ssl_trusted_certificate ssl/2015/rapid+geotrust.ca; (...) } |
Co należy zmienić
Oczywiście dla ssl_certificate/ssl_certificate_key ustawiacie ścieżki do własnego klucza i certyfikatu. Dodatkowo najlepiej podać parametr ssl_trusted_certificate, a jako wartość powinna być ścieżka do certyfikatu CA (firmy, która podpisała nasz CSR).
Ostatnią sprawą jest wygenerowanie parametru DH (Diffie-Hellman):
1 |
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048 |
Najważniejsze informacje
Możliwe, że niektóre parametry w powyższej konfiguracji są dla Was nowe. Albo zastanawiacie się dlaczego dodaję własny nagłówek.
1 |
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; |
Powyższa linia dodaje HSTS, który zabezpiecza np. przed kradzieżą ciasteczek.
1 2 |
ssl_session_timeout 5m; ssl_session_cache shared:NginxCache123:50m; |
Kolejne dyrektywy (ssl_session_timeout/ssl_session_cache) umożliwiają wznowienie sesji w celu zwiększenia wydajności https.
1 |
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; |
Następnie wyłączamy obsługę SSLv3, którego nazwa jest zwodnicza, bo to bardzo stare rozwiązanie umożliwiające chociażby słynne atak POODLE.
1 |
ssl_prefer_server_ciphers on; |
Natomiast włączenie ssl_prefer_server_ciphers zabezpiecza nas przed atakiem BEAST.
1 2 3 4 |
ssl_stapling on; resolver 208.67.220.220; ssl_stapling_verify on; ssl_trusted_certificate ssl/2015/rapid+geotrust.ca; |
A także włączam OSCP stapling (oficjalnie znane jako rozszerzenie TLS Certificate Status Request) poprzez parametr ssl_stapling.
Na koniec tylko formalnie dodam. Pamiętajcie o używaniu wyłącznie algorytmu SHA-2, ponieważ SHA-1 został uznany za słaby i niebezpieczny. Nadal z certyfikatów wykorzystujących SHA-1 korzysta ponad 1 mln domen w Internecie.
Jeśli znacie inne „sztuczki”, liczę na Wasze komentarze.