Instalacja certyfikatu SSL w nginx

nginx logo


  1. 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
  2. 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;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
    ssl_prefer_server_ciphers on;
    
    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.
    • ssl_certificate_key - Plik zawierający klucz prywatny.
    • ssl_certificate - Plik zawierający certyfikat serwera i certyfikat pośredni wystawcy.
    • ssl_protocols TLSv1.2; - Włączenie protokołu TLSv1.2, jednocześnie wyłączenie przestarzałych SSLv2, SSLv3, TLSv1 i TLSv1.1. Obsługa protokołu TLSv1.2 jest dostępna w OpenSSL 1.0.1 i wyższych.
    • ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256' - Ustawienie priorytetu dla silnych szyfrów (ang. ciphers), jednocześnie wyłączenie słabych i przestarzałych.
    • ssl_prefer_server_ciphers on; - Wymuszenie przez serwer kolejności stosowania szyfrów.
    • 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)

  3. 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-----
  4. 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-----
  5. 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
  6. Sprawdź poprawność konfiguracji przez restartem serwera nginx.
    sudo service nginx configtest
    Jeżeli w wyniku testu pojawi się [Fail] zobacz poniżej do sekcji Częste problemy.
  7. Zrestartuj serwer nginx.

    dystrybucje Debian lub Ubuntu

    sudo service nginx restart

    system MacOS (manager pakietów Homebrew)

    sudo nginx -s reload
  8. Przetestuj zdalnie konfigurację serwera za pomocą publicznego serwisu DigiCert SSL Certificate Checker lub Qualys SSL Server Test. Qualys SSLLabs

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

  1. Serwer nginx nie startuje. Komunikat o błędzie w /var/log/nginx/error.log :
    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)
    Możliwe przyczyny i sposoby rozwiązania:

    1. Klucz prywatny nie pasuje do certyfikatu serwera. Upewnij się, czy używasz odpowiedniego klucza prywatnego.
    2. 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.

Pokrewne linki


Przydatne linki