wtorek, 26 maja 2015

[APACHE] Konfiguracja HTTPS na localhoście - zabawa z OpenSSL

TRUE
4301031849970711205
W artykule tym nauczymy się jak na lokalnym serwerze stworzyć możliwości do obsługi protokołu https://. Pozwoli to nam na lokalne testowanie tych elementów naszej aplikacji, które w wersji produkcyjnej będą działać na połączeniu szyfrowanym. Do stworzenia sobie takiej funkcjonalności potrzebny będzie nam certyfikat SSL, którym konieczne będzie podpisanie naszego serwera. Certyfikaty takie kosztują i są wydawane dla konkretnej domeny przez uprawnione do tego organy, jak np. VeriSign.

My oczywiście nie będziemy kupować żadnego certfikatu dla własnych lokalnych potrzeb - zamiast tego skorzystamy z darmowego pakietu OpenSSL i taki certyfikat wygenerujemy oraz podpiszemy sobie sami. Wiąże się to z pewną małą "niedogodnością" - mianowicie przeglądarki będą pluły nam informacją o tym, iż nasz certfikat jest niezaufany i z niepewnych źródeł ;) Wystarczy jednak to zignorować.

OpenSSL

No to zaczynamy. Pierwszą sprawą jest zaopatrzenie się w darmowy pakiet OpenSSL, który pobierzemy stąd: http://indy.fulgan.com/SSL/. Na Linuxach pakiet ten powinien być dostępny domyślnie, dla Windowsów musimy go pobrać, zróbmy więc to. Wchodzimy na w/w stronę, pobieramy najnowszą dostępną wersję odpowiednią dla naszego systemu (32/64 bity) i rozpakowujemy, np. do:

  1. C:\OpenSSL

To jedna sprawa - druga to włączenie modułu SSL w samym Apache'u (jest on domyślnie wyłaczony). Otwieramy do edycji plik konfiguracyjny Apache'a (jako administrator):

  1. /ścieżka/do/apache/conf/httpd.conf

i szukamy linijki:

  1. LoadModule ssl_module modules/mod_ssl.so

Jeśli jest ona poprzedzona komentarzem (#) to usuwamy go.
Zapiszmy plik i zrestartujmy Apache:

  1. httpd -k restart

Uwaga - jeśli nie posiadamy modułu mod_ssl.so to bedziemy musieli go do naszego serwera doinstalować.

Klucz i certyfikat

Wróćmy do pobranego przez nas pakietu OpenSSL.
Czeka nas wygenerowanie nowego certyfikatu.
Służy do tego narzędzie openssl, a jakże ;)
Na początku stworzymy sobie folder na nasz certyfikat i klucz, np.

  1. C:\certSSL

Uruchomijmy zatem terminal/konsolę (UWAGA: koniecznie jako administrator), a następnie stwórzmy powyższy folder i wejdżmy do niego:

  1. mkdir C:\certSSL
  2.  
  3. cd C:\certSSL

Wpiszmy teraz w konsoli:

  1. openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout localhost.key -out localhost.cert

Rozpocznie się procedura generowania klucza.
Zostaniemy poproszeni o podanie danych takich jak kod naszego kraju, nazwa organizacji itd.
Wpiszmy tam jakieś podstawowe dane - zostaną one wpisane do certyfikatu.
Ważne jest jednak pole Common Name, określające adres strony dla jakiej wystawiamy certyfikat.
Jeśli wystawiamy dla naszego localhosta to wpiszmy tam:

  1. localhost

Jeśli wszystko poszło dobrze to powinniśmy w folderze C:\certSSL otrzymać 3 pliki:

  • .rnd
  • localhost.cert
  • localhost.key

Plik .rnd usuwamy.

Interesują nas 2 pozostałe pliki:

  • localhost.cert - czyli nasz certfikat
  • localhost.key - nasz wygenerowany klucz prywatny

Instalacja klucza i certyfikatu

Oba pliki kopiujemy do katalogu z konfiguracją Apache'a:

  1. /ścieżka/do/apache/conf/ssl

(katalog ssl tworzymy sami)

V-HOST

Następnie będziemy musieli stworzyć nowego v-hosta (więcej o tworzeniu vhostów napisałem w tym artykule). Wchodzimy zatem do pliku z konfiguracją v-hostów, najczęściej jest to:

  1. /ścieżka/do/apache/conf/extra/httpd-vhosts.conf

i dodajemy nowego wirtualnego hosta, np:

  1. <VirtualHost *:443>
  2.  
  3.     ServerAdmin nasz@email.com
  4.  
  5.     DocumentRoot "c:/www"
  6.  
  7.     ServerName localhost
  8.  
  9.     ServerAlias localhost
  10.  
  11.     SSLEngine On
  12.  
  13.     SSLCertificateFile conf/ssl/localhost.cert
  14.  
  15.     SSLCertificateKeyFile conf/ssl/localhost.key
  16.  
  17.     ErrorLog "logs/localhost-ssl-error.log"
  18.  
  19.     CustomLog "logs/localhost-ssl-access.log" common
  20.  
  21. </VirtualHost>
  22.  


Jak widzimy w konfiguracji - połączeń po SSL nasłuchiwać będziemy na porcie 443
DocumentRoot pozostaje bez zmian, ale możemy tutaj podać oddzielny katalog na zawartość przesyłaną po https://.
To co najbardziej rzuca się w oczy, to:

  1. SSLEngine On
  2.  
  3. SSLCertificateFile conf/ssl/localhost.cert
  4.  
  5. SSLCertificateKeyFile conf/ssl/localhost.key
  6.  

To właśnie tutaj uruchamiamy SSL dla tego v-hosta oraz definiujemy ścieżki do certfyfikatu i klucza.

httpd.conf

V-hosta już mamy, ale to jeszcze nie wszystko, gdyż teraz w zależności od obecnej konfiguracji naszego Apache'a dalsza procedura moze być różna. Najlepiej wyszukajmy w pliku httpd.conf wszystkie wystąpienia słowa SSL i przyjrzyjmy się jakie elementy odnośnie SSL są implementowane.
Kluczowym jest, abyśmy dodali w konfiguracji następujący wpis:

  1. Listen 443
  2.  
  3. <IfModule ssl_module>
  4.  
  5. SSLRandomSeed startup builtin
  6.  
  7. SSLRandomSeed connect builtin
  8.  
  9. </IfModule>
  10.  

Pierwsza linijka nakazuje Apachowi nasłuchiwania na porcie 443 - bez niej nasz serwer nie przyjmie żadnego połaczenia po protokole HTTPS.
Kolejne parametry definiują rodzaj generowanego ziarna za pomocą liczb losowych.

https://

Jeśli wszystko poszło zgodnie z planem, to zrestartujmy serwer i spróbujmy dostać się do naszego localhosta za pomocą:

  1. https://localhost

Jeśli wszystko poszło jak należy, pominniśmy zostać na wstępie poinformowani o niepewnym pochodzeniu naszego certyfikatu, samo zaś połączenie po SSL powinno w tym momencie działać.

2 komentarze:

  1. ja mam w pracy u siebie serwer ale na całe szczęście tymi rzeczami zajmuje się mój informatyk. Ja za to mogę bez problemu pracować na systemie ERP https://www.connecto.pl/system-erp-do-zarzadzania-firma/ który moim zdaniem jest bardzo dobrym systemem.

    OdpowiedzUsuń
  2. Bardzo fajny artykuł. Jestem pod wrażeniem.

    OdpowiedzUsuń

Masz sugestię? Znalazłeś błąd? Napisz komentarz! :)

webmaester.pl - profesjonalne projektowanie WWW i webaplikacji
webmaester.pl - profesjonalne projektowanie WWW i webaplikacji