Generowanie i instalowanie certyfiaktu SSL na serwerze www nginx

  • Data: 2013

W poprzednim artykule: Darmowe certyfikaty SSL opisałem gdzie można zdobyć darmowy a zarazem zaufany przez przeglądarki certyfikat SSL. Tym razem zajmiemy się częścią praktyczną czyli generowaniem i instalacją certyfikatu SSL dla naszej strony. Jako, że jestem fanem serwera nginx, opis konfiguracji będzie dotyczył właśnie tego serwera www. Tworząc certyfikat będziemy korzystali z pakietu openssl, choć zawsze można posiłkować się generatorem online.
Drugim warunkiem jest nginx skompilowany z obsługą modułu ssl. W konsoli wywołujemy: nginx -V, jeśli dostaniemy: --with-http_ssl_module to "jesteśmy w domu", w innym przypadku musimy przekompilować nginx-a. Proces kompilacji można znaleźć w artykule o konfiguracji rtorrent + rutorrent = GUI/WebUI.

Tworzenie certyfikatu:

  • wszystkie czynności wykonujemy z konta root
  • Stwórzmy katalog na certyfikat, np. mkdir -p /etc/nginx/ssl/nazwa_naszej_domeny
  • Generujemy klucz RSA bez hasła (umożliwia restart serwera www bez podawania hasła):
  • openssl genrsa -out mojadomena.key 2048
  • Jeśli nam nie przeszkadza podawanie za każdym razem hasła (min. 4 litery):
  • openssl genrsa -des3 -out mojadomena.key 2048
  • Generowanie żądania certyfikatu:
  • openssl req -new -key mojadomena.key -out mojadomena.csr
  • Podczas generowania żądania certyfikatu (CSR) zostaniemy poproszeni o podanie kilku informacji nie używając polskich znaków diakrytycznych (ą, ł, ó, Ł, Ó...) oraz znaków specjalnych ( ? . , > ~ ! # @ $ % ^ * / \ ( ) ) :
    
    	
  • Country Name - podajemy dwuliterowy symbol kraju
  • State or Province Name - pełna nazwa województwa, np. Małopolskie
  • Locality Name - pełna nazwa miasta
  • Organization Name - pełna nazwa naszej firmy / organizacji, np. Nazwa Firmy SA
  • Organizational Unit Name - dział firmy / organizacji
  • Common Name - pełna nazwa domenowa (FQDN) szyfrowanej strony, np. poczta.nasza_domena.pl
  • Email - do kontaktu w sprawie certyfikatu (pole niewymagane)
  • A challenge password []: - nie uzupełniamy
  • An optional company name []: - nie wymagane
  • Po utworzeniu pliku csr logujemy się do serwisu StartSSL a następnie klikamy w Certificates Wizard wybierając Web Server SSL/TLS Certificate
  • Następnie wybieramy Skip, dochodzimy do Submit Certificate Request. Wklejamy zawartość naszego pliku csr
  • Jeśli wszystko poszło po naszej myśli zobaczmy komunikat: Certificate Request Received
  • Wybieramy z listy naszą domenę
  • Następnie zostaniemy poproszeni o podanie subdomeny, którą chcemy zabezpieczyć (np. www.nasza_domena.pl)
  • Zapisujemy wygenerowany certyfikat pod nazwą mojadomena.crt
  • Ściągamy na serwer plik: wget https://www.startssl.com/certs/class1/sha2/pem/sub.class1.server.sha2.ca.pem
  • Dołączamy zawartość pliku do naszego certyfikatu: cat mojadomena.crt sub.class1.server.sha2.ca.pem >> mojadomena.pem
  • Dobrze nadać prawidłowe prawa naszym plikom:
    chmod 600 /etc/nginx/ssl/nazwa_naszej_domeny/mojadomena.key
    	
    chmod 600 /etc/nginx/ssl/nazwa_naszej_domeny/mojadomena.pem

Konfiguracja: nginx + SSL
W tym momencie pozostaje uruchomienie SSL na serwerze nginx. Jako, że wygenerowaliśmy certyfikat SSL dla subdomeny, skonfigurujemy v-hosta. Dla uproszczenia przyjmuję, że naszą domeną jest: poczta.domena.pl . Sama konfiguracja jest identyczna dla wszystkich dystrybucji niemniej jednak może różnić się np. ścieżkami. Poniższa konfiguracja została przeprowadzona na Debianie. Konfiguracja będzie tak skonstruowana, żeby użytkownik nie musiał specjalnie wpisywać w przeglądarkę: https://poczta.domena.pl wystarczy: poczta.domena.pl .

  • Tworzymy plik konfiguracyjny naszego wirtualnego hosta: touch /etc/nginx/sites-available/poczta
  • server {
                listen  80;
                server_name  poczta.domena.pl;
    			
                ## stare mało optymalne rozwiązanie: wiki.nginx.org/IfIsEvil
                # if ($host = 'poczta.domena.pl' ) {
                #     rewrite ^/(.*)$ https://poczta.domena.pl/$1 permanent;
                # }
    			
                # aktualne rozwiązanie
                return       301 https://poczta.domena.pl$request_uri;
    			
                access_log  /var/log/nginx/poczta.domena.pl.access.log;
                error_log  /var/log/nginx/poczta.domena.pl.error.log;
            }
    
    server	{
                listen 443;
                ssl on;
                server_name poczta.domena.pl; 
    ssl_certificate /etc/nginx/ssl/poczta.domena.pl/mojadomena.pem; ssl_certificate_key /etc/nginx/ssl/poczta.domena.pl/mojadomena.key;
    access_log /var/log/nginx/poczta.domena.pl.access_log; error_log /var/log/nginx/poczta.domena.pl.error_log; . . # dalsza część pliku konfiguracyjnego }
  • Tworzymy link symboliczny: ln -s /etc/nginx/sites-available/poczta /etc/nginx/sites-enabled/poczta
  • Następnie restart nginx-a: /etc/init.d/nginx restart
  • Na koniec sprawdźmy czy przeglądarka akceptuje nasz certyfikat (widok:Google Chrome):
  • startssl nginx