[Apache] Tworzymy własny certyfikat SSL

Ostatnio przez większość czasu zajmuję się produktami ze stajni Microsoftu (zarówno jeśli chodzi o programowanie jak i systemy serwerowe), nadszedł czas na małą Apachow’ą odskocznię.

Krótki przewodnik jak zmusić Apacha zainstalowanego na… Windowsie (hmmm, diabelskie połączenie?) do pogadania z nami po SSLu.

OpenSSL

Będziemy potrzebować OpenSSL, obecnie jest domyślnie zawarty w Apache2.

Narzędzie openssl znajduje się w podfolderze conf katalogu instalacyjnego Apacha (np. D:\PROGRAMY\xampp\apache\conf\):

opensslExe
OpenSSL.exe

Aby wygenerować certyfikat potrzebujemy pliku openssl.conf.
Niestety jego domyślna lokalizacja – zaszyta w openssl.exe wskazuje na ścieżkę linuxową:

Domyślna ścieżka...
Domyślna ścieżka…

Musimy dodać do zmiennych środowiskowych Windowsa wartość OPENSSL_CONF, która uzdrowi sytuację (Openssl szuka tej zmiennej, jeśli jej nie znajdzie przyjmuje domyślną lokalizację).

Plik openssl.conf znajduje się w folderze conf, np.
D:\PROGRAMY\xampp\apache\conf\openssl.cnf

W cmd wydajemy więc polecenie:

set OPENSSL_CONF=d:\PROGRAMY\xampp\apache\conf\openssl.cnf

Generowanie certyfikatu

Teraz możemy przystąpić do wygenerowania naszego certyfikatu, uruchamiamy polecenie:

openssl req -new -out server.csr

Przyjemny kreator przeprowadzi nas przez proces tworzenia certyfikatu, jeśli certyfikat ma być wykorzystywany produkcyjnie trzeba starannie odpowiedzieć na pytania kreatora.

Ważna jest odpowiedź na pytanie PEM pass phrase, jest to hasło naszego klucza prywatnego.

Sugeruję usunąć plik z rozszerzeniem .rnd, zawiera informacje o wygenerowanych danych pseudolosowych, gdyby dostał się w niepowołane ręce może posłużyć do ataku na nasz klucz prywatny.

Teraz czeka nas konwersja wygenerowanego wcześniej klucza prywatnego do formatu RSA, chodzi głównie o usunięcie hasła:

openssl rsa -in privkey.pem -out server.key

Teraz najważniejsze – tworzymy podpisany przez nas (self signed) certyfikat:

openssl x509 -in server.csr -out server.cert -req -signkey server.key -days 365

Argument x509 wystawia certyfikat i podpisuje go prywatnym kluczem serwera. Przełącznik – days mówi ile dni ważny będzie certyfikat.

Gotowe!

Korzystamy z wygenerowanego certyfikatu

Przenosimy certyfikat i klucz prywatny serwera do folderu conf, np.: D:\PROGRAMY\xampp\apache\conf
Pozostało zmuszenie Apacha do skorzystania z certyfikatu.

Najpierw w pliku httpd.conf (znajduje się oczywiście w folderze conf) odkomentowujemy (poprzez usunięcie znaków #) ładowanie i podłączanie modułu i pliku konfiguracyjnego odpowiedzialnych za obsługę SSL, są to linie:

LoadModule ssl_module modules/mod_ssl.so
Include conf/extra/httpd-ssl.conf

W dalszej kolejności – w pliku conf/extra/httpd-ssl.conf umieszczamy następującą zawartość:

UWAGA: Sekcja ta prawdopodobnie będzie już w pliku, sugeruję wyczyścić jej zawartość (najprostsza opcja), lub rozsądnie połączyć to co tam jest z tym co należy wstawić:

<VirtualHost _default_:443>
 ServerAdmin [email protected]
 DocumentRoot "Your Root folder location"
 ServerName localhost:443
 ServerAlias localhost:443
 ErrorLog "D:/PROGRAMY/xampp/apache/logs/error.log"
 TransferLog "D:/PROGRAMY/xampp/apache/logs/access.log"
 SSLEngine on
 SSLCertificateFile "d:\PROGRAMY\xampp\apache\conf\server.cert"
 SSLCertificateKeyFile "d:\PROGRAMY\xampp\apache\conf\server.key"
 </VirtualHost>

Ścieżki do plików trzeba oczywiście wpisać odpowiednio dla danego serwera. 🙂

TIPS:

Jeśli lubimy porządek możemy konfigurację Wirtualnych Hostów przenieść do pliku conf\extra\httpd-vhosts.conf, pamiętajmy tylko wtedy o odkomentowaniu linii

Include conf/extra/httpd-vhosts.conf w pliku conf\httpd.conf

Firewall

Pamiętajmy również o przepuszczeniu portu https (domyślnie 443) na naszym firewallu.

Na końcu pozostał restart serwera; jeśli nie chce się uruchomić czeka nas troubleshooting poprzez analizę pliku error.log.

Co to są klucze prywatny i publiczny, oraz dlaczego certyfikat jest niepodpisany i jakie niesie to konsekwencje dowiecie się w kolejnym wpisie.  🙂

4 odpowiedzi na “[Apache] Tworzymy własny certyfikat SSL”

  1. czy sa jakies szczegolne uwagi w przypadku windows 10? zrobilam tak, jak wyzej i niestety nie jestem w stanie odpalic ponownie apache. dostaje taki blad
    http://www.example.com:443:0 server certificate does NOT include an ID which matches the server name
    jaki powinien byc common name w certyfikacie, jesli instaluje go na localhost ?

    1. Na Windows 10 nie ma żadnych innych kwestii do ustawienia…
      Jeśli instalujesz go na localhoście w pole CN wpisz: localhost. 🙂

  2. mi sie apache odpalil, ale w przegladarce dostaje error, ze polaczenie nie jest bezpieczne (blad w konfiguracji serwera). Czas wyprobowac inny tutorial.

    1. Czy to na pewno informacje, że połączenie nie jest bezpieczne? A może, że certyfikat nie jest zaufany?
      Komunikat o nie niezaufanym certyfikacie jest normalny, ponieważ został wystawiony przez nas, a nie przez zaufane centrum (jedyna opcja to dodać go do magazynu zaufanych certyfikatów)…

Leave a Reply