Instalacja certyfikatu SSL w serwerze nginx
03.06.2023
- Utwórz plik zawierający konfigurację nowego serwera wirtualnego. Zakładamy, że plik będzie miał nazwę
www.moja-domena.pl.conf
sudo touch /etc/nginx/sites-available/www.moja-domena.pl.conf
- Do pliku konfiguracyjnego
/etc/nginx/sites-available/www.moja-domena.pl.conf
wklej poniższą zawartość:server { listen 1.2.3.4:443 ssl http2; server_name www.moja-domena.pl; root root /var/www/html; index index.html index.htm; access_log /var/log/nginx/www.moja-domena.pl.log; error_log /var/log/nginx/www.moja-domena.pl.log error; ssl_certificate_key /etc/nginx/ssl/www.moja-domena.pl.key; ssl_certificate /etc/nginx/ssl/www.moja-domena.pl.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; add_header Strict-Transport-Security max-age=31536000; }
listen 1.2.3.4:443
- Adres IP i port pod którym będzie nasłuchiwał serwer nginx w szyfrowanym połączeniu SSL.ssl http2
- Włączenie SSL oraz protokołu HTTP/2 ( RFC 7540), który m.in. skraca czas ładowania stron. Obsługa protokołu HTTP/2 jest dostępna od wersji nginx 1.10.0. HTTP/2 zastępuje protokół SPDY zapoczątkowany przez Google.ssl_certificate_key
- Plik zawierający klucz prywatny.ssl_certificate
- Plik zawierający certyfikat serwera i certyfikat pośredni wystawcy.ssl_protocols TLSv1.2 TLSv1.3
- wyłączenie przestarzałych protokołówSSLv2
,SSLv3
,TLSv1.0
,TLSv1.1
. Włączenie aktualnie bezpiecznych protokołówTLSv1.2
iTLSv1.3
.ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
- Ustawienie priorytetu dla silnych szyfrów ( ang. ciphers), jednocześnie wyłączenie słabych i przestarzałych.add_header Strict-Transport-Security
- Nagłówek Strict-Transport-Security (HSTS) powiadamia przeglądarkę aby za każdym razem łączyła się do serwera tylko poprzez protokół SSL (HTTPS). Czas ustalony w max-age podaje się w sekundach (31536000 sekund = 12 miesięcy)
- Do pliku
/etc/nginx/ssl/www.moja-domena.pl.key
przenieś klucz prywatny. Użyj tego samego klucza, za pomocą którego wygenerowałeś CSR, który następnie przesłałeś w formularzu zamówieniowym Gigaone w celu wystawienia certyfikatu SSL.
Struktura pliku z kluczem prywatnym powinna być następująca:-----BEGIN PRIVATE KEY----- IEvwIBADANBgkqhki4/IWM5mvU/3ErC77llAgEAAoIBAQOAwfCnTKLWDYBrOAw 0lezH9BwMkOrrgIgAOnE4d6zFf5MYZjzf3PnQvwy5KDDVxhbee43FetdrQbKaf FJKdVVwjHJUdgGkWazsMPPLZndhINTlsOl0Vy59+7fLc0XbyfghlA0BK8CgYB0 V3bsdWE9X0V8wBQnp1V+k3FA4f== ---END PRIVATE KEY-----
Do pliku
/etc/nginx/ssl/www.moja-domena.pl.pem
przenieś wystawiony certyfikat SSL oraz certyfikat pośredni wystawcy. Certyfikat serwera, jak i certyfikat pośredni możesz pobrać z Panelu Klienta Gigaone. Bardzo ważne jest zachowanie kolejności certyfikatów w pliku – najpierw certyfikat SSL serwera, a następnie certyfikat pośredni.Struktura pliku z certyfikatami powinna być następująca:
-----BEGIN CERTIFICATE----- jLjNGrII5i98fcKYlXhxuvts7dcMD5m1b+nwcO4gt ezN2vxF+gjG0hU804uFXwgIgAOnE6ksTRSxVcvcR+ « certyfikat serwera O2IWGtrgZqYZN2zPAQpYaXc5NOjJbi2vcbxcbvvbj -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- BgNVsHR8t587fdghddfgEP6DAMDigNqA0hjJodHRw Oi8vcmFwgIgAOnEkLmdl5cejjb3eefrRydXN0LmNv « certyfikat pośredni wystawcy BDvp4RHwRE44bT49ymDAdvsfgX3kVWGWfGpN3Q -----END CERTIFICATE-----
- Utwórz link symboliczny do pliku
/etc/nginx/sites-available/www.moja-domena.pl.conf
z nowo utworzonym serwerem wirtualnym. Serwer nginx podczas startu przeszukuje katalog/etc/nginx/sites-available
i aktywuje wszystkie znalezione serwery wirtualne.sudo ln -s /etc/nginx/sites-available/www.moja-domena.pl.conf /etc/nginx/sites-enabled/www.moja-domena.pl.conf
- Sprawdź poprawność konfiguracji przez restartem serwera nginx.
Jeżeli w wyniku testu pojawi sięsudo service nginx configtest
[Fail]
zobacz poniżej do sekcji Częste problemy. - Zrestartuj serwer nginx.
sudo service nginx restart
system MacOS (manager pakietów Homebrew)
sudo nginx -s reload
- Przetestuj zdalnie konfigurację serwera za pomocą publicznego serwisu DigiCert Check website security lub Qualys SSL Server Test.
Przekierowanie z HTTP do HTTPS (SSL)
Jeżeli używasz osobnego pliku konfiguracyjnego do serwowania strony w połączeniu nieszyfrowanym należy umieścić dodatkową linię return 301 https://$host$request_uri;
, która przekieruje wszystkie odwołania do strony nieszyfrowanej na stronę w połączeniu szyfrowanym (HTTPS).
server {
listen 1.2.3.4:80;
server_name www.moja-domena.pl;
return 301 https://$host$request_uri;
}
Częste problemy
- Serwer nginx nie startuje. Komunikat o błędzie w
/var/log/nginx/error.log
:
Możliwe przyczyny i sposoby rozwiązania:SSL_CTX_use_PrivateKey_file("/etc/nginx/ssl/www.moja-domena.pl.key") failed (SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch)
- Klucz prywatny nie pasuje do certyfikatu serwera. Upewnij się, czy używasz odpowiedniego klucza prywatnego.
- Niewłaściwa kolejność certyfikatu serwera i certyfikatu pośredniego w pliku określonym dyrektywą
ssl_certificate
. Serwer nginx spodziewa się pierwszego certyfikatu jako certyfikatu serwera. Zmień kolejność certyfikatów.
Przydatne linki
- Strona domowa nginx: nginx.org
- Configuring HTTPS servers: nginx.org/.../configuring_https_servers.html
- Rozszerzenie do przeglądarek informujące o włączonym protokole HTTP/2:
- Firefox: HTTP/2 Indicator
- Chrome: HTTP Indicator