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:
[code]C:\OpenSSL[/code]
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):
[code]/ścieżka/do/apache/conf/httpd.conf[/code]
i szukamy linijki:
[code]LoadModule ssl_module modules/mod_ssl.so[/code]
Jeśli jest ona poprzedzona komentarzem (#) to usuwamy go.
Zapiszmy plik i zrestartujmy Apache:
[code]httpd -k restart[/code]
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.
[code]C:\certSSL[/code]
Uruchomijmy zatem terminal/konsolę (UWAGA: koniecznie jako administrator), a następnie stwórzmy powyższy folder i wejdżmy do niego:
[code]mkdir C:\certSSL
cd C:\certSSL[/code]
Wpiszmy teraz w konsoli:
[code]openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout localhost.key -out localhost.cert[/code]
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:
[code]localhost[/code]
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:
[code]/ścieżka/do/apache/conf/ssl[/code]
(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:
[code]/ścieżka/do/apache/conf/extra/httpd-vhosts.conf[/code]
i dodajemy nowego wirtualnego hosta, np:
[code]
<VirtualHost *:443>
    ServerAdmin nasz@email.com
    DocumentRoot "c:/www"
    ServerName localhost
    ServerAlias localhost
    SSLEngine On
    SSLCertificateFile conf/ssl/localhost.cert
    SSLCertificateKeyFile conf/ssl/localhost.key
    ErrorLog "logs/localhost-ssl-error.log"
    CustomLog "logs/localhost-ssl-access.log" common
</VirtualHost>
[/code]

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:
[code]
SSLEngine On
SSLCertificateFile conf/ssl/localhost.cert
SSLCertificateKeyFile conf/ssl/localhost.key
[/code]
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:
[code]
Listen 443
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
[/code]
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ą:
[code]https://localhost[/code]
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