piątek, 23 października 2009

HTTPS: jak uruchomić SSL w serwerze Apache?

Potrzebna nam będzie działająca instalacja serwera Apache oraz pakiet OpenSSL. Apache powinien dysponować modułem mod_ssl. Może on być albo wkompilowany w serwer, albo ładowany oddzielnie. O tym, że mod_ssl został wkompilowany w serwer, możemy się przekonać, wydając polecenie apache2 -l (lub httpd -l – w zależności od systemu, na jakim pracujemy). Jeśli zaś mod_ssl jest niezależnym modułem, to w katalogu z modułami Apache'a powinien znaleźć się plik mod_ssl.so. Jeżeli jednak mod_ssl nie występuje w żadnym z tych miejsc, musimy albo zrekompilować serwer, albo poszukać pakietu zawierającego ten moduł.
Generowanie klucza

Na początku należy stworzyć klucz i certyfikat, za pomocą którego dane będą szyfrowane i deszyfrowane z serwera WWW. Najlepiej wykorzystać w tym celu generator (pseudo)losowych znaków. Jeden z najlepszych generatorów liczb pseudolosowych można znaleźć w Sieci – to serwis www.random.org. Możemy w nim wygenerować łańcuchy dowolnej długości, składające się z cyfr oraz małych i dużych liter. Wygenerowany łańcuch zapisujemy do pliku, którym następnie „nakarmimy” generator liczb losowych OpenSSL-a.

Robimy to za pomocą komendy:
openssl genrsa -des3 -rand plik.txt -out serwer.klucz 1024

OpenSSL zapyta o hasło – może być ono dowolne. Problem tylko z tym, że przy każdym restarcie Apache'a będziemy musieli je podawać. Jeśli nie chcemy uwierzytelniać klucza serwera przy każdym jego uruchomieniu, można usunąć hasło za pomocą komendy:

openssl rsa -in serwer.klucz -out serwer.bezszyfru

Po podaniu klucza podanego w poprzednim kroku openssl generuje nam plik serwer.bez zawierający niezaszyfrowany klucz serwera.

Teraz, mimo że sami będziemy sobie podpisywali certyfikat, należy wygenerować żądanie podpisu certyfikatu. Robimy to komendą:

openssl req -new -key serwer.bezszyfru -out serwer.cert

OpenSSL zapyta nas o rozmaite informacje, takie jak kod ISO kraju (np. PL), miasto, nazwę organizacji lub firmy czy też nasze nazwisko. Jeżeli nie chcemy się zbytnio nad tym wszystkim rozwodzić, to możemy pozostawić wszystkie pola puste.

Kolejny krok polega na podpisaniu certyfikatu. Robi się to za pomocą komendy:

openssl x509 -req -in serwer.cert -signkey serwer.bezszyfru -out serwer.cert

Oczywiście, nie ma się co łudzić, że ktoś będzie honorował nasz podpis. Ostatecznie nie jesteśmy VeriSignem czy Thawte i przeglądarki będą wyświetlały ostrzeżenie, że nasz certyfikat jest nieważny.

Stworzone w ten sposób pliki należy skopiować do katalogu konfiguracyjnego Apache'a i tak ustawić ich prawa dostępu, aby były one odczytywalne tylko dla roota. Można to zrobić następująco:

find /etc/apache2/serwer* -type f |xargs chmod 400

Jest to szczególnie ważne, jeżeli zdecydowaliśmy się nie szyfrować naszego klucza.

Konfigurowanie serwera

Pierwszą czynnością jest tu sprawdzenie w głównym pliku konfiguracyjnym Apache'a apache2.conf (lub httpd.conf), czy moduł mod_ssl jest ładowany (jeśli nie jest wkompilowany w serwer). Jeżeli jej nie ma, musimy dodać dyrektywę Load Module, której argumentami są ssl_module i ścieżka do pliku mod_ssl.so. Należy też usunąć znak # przed dyrektywą Include httpd-ssl.conf.

Następnie trzeba wprowadzić zmiany w pliku httpd-ssl.conf. W sekcji VirtualHost należy sprawdzić, czy dyrektywa DocumentRoot jest ustawiona na miejsce, w którym chcemy hostować bezpieczne strony. Domyślnie jest to zwykły katalog WWW – najczęściej htdocs, lepiej jednak stworzyć dla nich osobne miejsce – np. /var/www/htdocs-ssl.
Linia, która zaczyna się od frazy SSLCipherSuite, jest listą dozwolonych i zabronionych standardów szyfrowania. Kolejność, w jakiej się one znajdują, wyznacza ich priorytet podczas wyboru. To, co tutaj wybierzemy, zależy już od naszej polityki bezpieczeństwa. Im większe wymagania, tym więcej użytkowników ze starymi przeglądarkami pozostawiamy „na lodzie”. Blog InfiniteSecond zaleca zastosowanie następującej polityki:

SSLCipherSuite DHE-RSA-AES256-SHA:EDH-RSA-DES-CBC3-SHA:DHE-RSA-AES128-SHA: AES256-SHA:DES-CBC3-SHA:AES128-SHA:RC4-SHA

Z innymi, słabszymi wersjami można się zapoznać na stronie infinitesecond.blogspot.com/2008/03/recommended-sslciphersuite.html.

Teraz należy przejść do linii zaczynających się od SSLCertificateFile i SSLCertificateKeyFile, jako ich argumenty podając nazwy wygenerowanych wcześniej plików (odpowiednio serwer.cert i serwer.bezszyfru).

Ostatnią czynnością jest stworzenie zestawu reguł dla katalogu zawierającego bezpieczne strony – może to być coś takiego, choć oczywiście nie jest to zbyt restrykcyjne ustawienie:


Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all


Teraz po restarcie serwera Apache (/etc/init.d/apache2 restart), jeżeli wejdziemy na naszą stronę, korzystając z protokołu https:// (a nie http://), przeglądarka poinformuje nas, że korzystamy z bezpiecznego połączenia, wyświetlając w Pasku statusu małą kłódeczkę.

Brak komentarzy:

Prześlij komentarz