nginx – najlepszy przepis na SSL

HTTP/2 in nginx
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)

matipl.pl - SSL Server Test

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:

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):

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.

Powyższa linia dodaje HSTS, który zabezpiecza np. przed kradzieżą ciasteczek.

Kolejne dyrektywy (ssl_session_timeout/ssl_session_cache) umożliwiają wznowienie sesji w celu zwiększenia wydajności https.

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.

Natomiast włączenie ssl_prefer_server_ciphers zabezpiecza nas przed atakiem BEAST.

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.