Apache i SSL
wersja 0.9
 

Spis treści

Wstęp
Zaczynamy

1) OpenSSL
2) mod_ssl
3) Apache
Co dalej ?

Posłowie


Wstęp

    W dokumencie tym starałem się jak najdokładniej opisać
skonfigurowanie Apacza wraz z SSL. Nikomu nie muszę chyba wyjaśniać
"ta na co to wszystko". Rosnąca popularność wszelkiego rodzaju
rzeczy dostępnych przez www wraz z jeszcze bardziej rosnącym
lenistwem ludzi powoduje, że nawet sprawdzanie poczty użytkownicy
chcą mieć przez www. Tu się pojawiają hasła, sniffery, niezabezpieczony http, itp.

    Jeszcze pare słów wyjaśnienia, co tutaj opisuje ;).
Współpracę Apacza i SSL możemy skonfigurować (o ile mi wiadomo)
na dwa sposoby: (1) Apache + apache_ssl lub (2) Apache + mod_ssl.
Sposób pierwszy polega na wkompilowaniu SSLa do Apacza, jest cholernie
zagmatwane i zalecane, gdy serwer jest naprawdę obciążony. Drugi sposób,
ten, który opisuję, jest nieznacznie wolniejszy, ale o wiele szybciej i
łatwiej go zmajstrować.

    Cały problem polega na tym, że samo tworzenie kluczy, certyfikatów itp. jest
dość skomplikowane i opis tego zajmie jakieś 80% właściwej treści tego
dokumentu. Natomiast samo skonfigurowanie Apacza jest stosunkowo proste.
Rada dla Ciebie: jeśli przekopiesz się, i zaskoczysz opis openssl'a,
z Apaczem nie powienieś mieć problemu i co lepsze: będziesz mógł produkować
klucze i certyfikaty ile dusza zapragnie. No i jeszcze jedno: zrezygnowałem
tutaj z opisu gotowych skryptów programu OpenSSL, wszystko będziemy robić
ręcznie. Jeszcze mi za to podziękujesz ;)

    Dobra, koniec tego przydługiego wstępu. Podziękowania dla autorów prac,
którymi sobie pomagałem: Tym, Seeb, M. Malessa - THX !.


Zaczynamy

Najważniejsze rzeczy, które potrzebujemy: Gdy piszę ten dokument, korzystam z:
apache-1.3.27 (ostatnia dostępna wersja)
mod_ssl-2.8.14-1.3.27 (ostatnia wersja mod_ssl do ostatniego Apacza :)
openssl-0.9.7b (ostatnia dostępna wersja)

Ja zrobiłem to tak: wywaliłem swojego starego Apacza z dysku, nie zostało po
nim ani śladu, wcześniejszą wersję openssl'a też wyrzuciłem. Nie pozostało mi
nic. Najlepiej by było, żebyś skopiował swoje configi i strony www w jakieś
miejsce i wszystko wywalił. Tak czy inaczej, Apacza trzeba będzie od nowa
skompilować. To co tutaj opisuje testowałem na Slacku 8.0.
Teraz wrzucamy sobie wszystko do jakiegoś katalogu z instalkami. U mnie tak:
/root/Temp/ i tutaj wrzuciłem wszystkie trzy spakowane pliki. Nadszedł
już czas, żeby je wszyskie rozpakować. Po wydaniu odpowiednich poleceń, mam:
/root/Temp/mod_ssl-2.8.14-1.3.27/
/root/Temp/apache_1.3.27/
/root/Temp/openssl-0.9.7b/

Żeby nie odpowiadać na "niepoważne" e-maile, zakładam, że wszystko robię jako
użytkownik root. Bardziej zaawansowani (normalni:) użytkownicy będą wiedzieli
kiedy przłączać się na roota i czynności konfiguracyjne będą robili jako zwykły
user. W ten sposób oszczędzam swoje nerwy i Twój czas. Mam nadzieję, że wiesz
o co mi chodzi w tym momencie.


1) OpenSSL

Dobra, miejmy to z głowy... Sama konfiguracja, kompilacja i instalacja jest
prosta. Jeśli interesują Cię szczegóły - odsyłam do pliku INSTALL.
cd /root/Temp/openssl-0.9.7b/
./config
make
make test
make install


Domyślnym katalogiem, w którym zostaną zainstalowane nasze pliki jest
/usr/local/ssl/. Warto po instalacji dopisać:
- do /etc/profile, do zmiennej PATH: "....:/usr/local/ssl/bin"
Żeby zaczęło to działać, należy się wylogować i zalogować ponownie. W każdym
razie dobrze jest mieć plik "openssl" w każdym momencie dostępny.
- do /etc/ld.so.conf dopisać: "/usr/local/ssl/lib". Następnie wydajemy
komendę "ldconfig".
- zaleca się także stworzenie linku symbolicznego w /usr/local/:
ln -s ssl openssl
Okey. Kompilacja trwa dłuższą chwilę (przynajmniej na P133) dlatego robimy sobie
teraz przerwę na papierosa...
Dobra. Zaczynamy prawdziwą zabawę. To zdecydowanie najbardziej zamotana część
tego dokumentu, jeśli ją przetrwasz - reszta pójdzie szybko.

Z grubsza sprawa wygląda tak: potrzebujmemy certyfikat dla naszej strony www.
Tak więc możemy go sobie wygenerować. Składa się na to wygenerowanie klucza
prywatnego oraz prośby o certyfikat "podpisanej" przez ten klucz. Następnie ta
prośba powinna zostać zautoryzowana, podpisana, przez odpowiednią organizację
certyfikującą. Z tym nie ma problemu gdy masz kasę. W naszym wypadku sami staniemy
się organizacją certyfikującą (CA) dla siebie. To z kolei wymaga wygenerowania klucza
prywatnego dla organizacji certyfikującej oraz certyfikatu dla niej. Tym właśnie
certyfikatem organizacja certyfikująca podpisuje "prośby o certyfikat" dla stron www.

Tak więc po kolei. Najpierw staniemy się organizacją certyfikującą (CA). Potrzebujemy,
jak wcześniej wspomniałem klucza prywatnego CA oraz certyfikatu. Zakładam, że
nasze certyfikaty i klucze będziemy trzymać w katalogu /etc/ssl/, jeśli go nie masz,
utwórz go sobie. Dobra, przystępujemy do generowania klucza CA. Jeszcze jedno: klucze
standardowo mają rozszerzenie .key.
cd /etc/ssl
openssl genrsa -des3 -out ca.key 1024

W ten sposób utworzyliśmy prywatny klucz, ca.key, dodatkowo zaszyfrowany hasłem,
instytucji certyfikującej. Hasło musimy zapamiętać i nie może być zbyt proste.
Jeszcze raz zwracam uwagę na fakt, że nasz klucz prywatny jest zaszyfrowany.
Teraz musimy sobie wygenerować właściwy certyfikat CA. Będzimy proszeni o wpisanie
hasła do klucza prywatnego CA. Wszystko, co wpiszemy później to dane identyfikacyjne
CA - będą te rzeczy do wglądu poprzez strone www. Dlatego wpisujmy rzeczy sensowne,
popuszczając jednocześnie wodzę fantazji :)
openssl req -new -x509 -key ca.key -out ca.crt -days 1024

Otrzymaliśmy w ten sposób plik ca.crt, który jest właściwym
certyfikatem CA (do podpisywania innych). Podsumowując - mamy pliki ca.key
czyli klucz prywatny certyfikatu oraz ca.crt - właściwy certyfikat.
Certyfikaty mają rozszerzenie .crt. Kolejna uwaga:
Nasz certyfikat instytucji ma ważność 1024 dni, certyfikaty, które będziemy
podpisywać nie mogą mieć ważności dłuższej, niż sam certyfikat CA.
No i jeszcze ważna sprawa: plikom ca.* dajemy chmod 400:
chmod 400 ca.key ca.crt

Jeszcze jeden rodzaj rozszerzeń - .csr - są to "prośby o certyfikat".
Podpisuje się je certyfikatem CA i wtedy stają się ona właściwymi certyfikatami np. www.
Taki stworzymy dla nas. Przy okazji: csr to Certificate Signing Request.

Teraz stworzymy dla naszej strony www, dla naszego Apacza, klucz prywatny oraz
certyfikat (dokładnie: plik .csr, kandydat na certyfikat). Robimy:
openssl genrsa -des3 -out server.key 1024
Hasło należy zapamiętać, będzie ono potrzebne np. przy starcie Apacza z SSL.
Gdy mamy już klucz prywatny, pozostało wygenerować .scr, który później sobie
uwierzytelnimy:
openssl req -new -key server.key -out server.csr

Jako 'extra' atrybuty nic nie wpisujemy, naciskamy enter(ek).
Podajemy hasło, które przed chwilą sobie ustawiliśmy a następnie dane naszej
firmy, naszej strony www. W tym miejscu najważniejsze: w polu Common Name:
wpisujemy adres http strony, pod którą będzie działał (np. www.serwerek.pl).

W pliku, który powstał (server.csr), znajduje się "certificate request".
To mówi chyba samo za siebie. Podsumowując: mamy certyfikat CA (ca.crt), którym
zaraz podpiszemy "prośbę" o certyfikat (server.csr). Dwa hasła które mamy (dostęp
do plików ca.key i server.key będą potrzebne: pierwszy przy podpisywaniu "prośby"
a drugi w momencie startu Apacza z SSL. Czyli pliki ca.* należą
do instytucji certyfikującej a pliki server.* należą do Apacza.

Teraz ważna uwaga: teoretycznie podpisać "prośbę" można ręcznie, z linii poleceń
korzystając z "openssl ca.....[rozne parametry]" ale to spowoduje, że Internet
Explorer będzie zwracał błąd "Nie znaleziono serwera". W samej dokumentacji mod_ssl
napisano na ten temat: ""openssl ca" has some strange requirements and the default
OpenSSL config doesn't allow one easlily to use "openssl ca" directly.
".
W każdym samo podpisanie musimy zrobić przy pomocy skryptu znajdującego się w
kodzie źródłowym mod_ssl'a (u mnie: /root/Temp/mod_ssl-2.8.14-1.3.27/pkg.contrib/).

Tak więc kopiujemy wszystkie nasze pliki właśnie tam:
cp ca.crt ca.key server.csr server.key /root/Temp/mod_ssl.../pkg.contrib/
cd /root/Temp/mod_ssl.../pkg.contrib/
./sign.sh server.csr


Taa... Teraz musimy podać hasło klucza prywatnego CA (to pierwsze hasło). Wyświetlone
zostaną dane strony, którą chcemy podpisać. Przypominam, że w miejscu Common Name
powinien być widoczny adres http strony, dla której klucz podpisujemy. Jeśli jest o.k.
naciskamy 'y' (chyba dwa razy) i powstaje nam plik: server.crt. To właśnie
o to chodziło nam od początku. Dla Apacza potrzebne będą dwa pliki: plik z kluczem
dla www (server.key) oraz plik z certyfikatem dla www (server.crt).

Teraz spokojnie kasujemy pliki ca.* (z katalogu pkg.contrib):
rm ca.crt ca.key
oraz tworzymy sobie katalog /etc/ssl/apache i wrzucamy tam dwa pliki:
mkdir /etc/ssl/apache
mv server.key /etc/ssl/apache
mv server.crt /etc/ssl/apache

Prawdę mówiąc nie ma znaczenia, gdzie umieścimy powyższe pliki: Apacz po
skonfigurowaniu skopiuje je do swojego kodu źródłowego: do podkatalogów
conf/ssl.key/server.key oraz conf/ssl.crt/server.crt. Zostawiamy je jednak
dodatkowo w /etc/ssl/apache/.

Okej. Teraz możemy wykasować pliki /etc/ssl/server* - nie są nam już
potrzebne (to, czego potrzebujemy jest w /etc/ssl/apache).
cd /etc/ssl
rm server*


Teraz czas na "mod_ssl". Tu już będzie z górki.


2) mod_ssl

Cały czas zakładam, że jesteśmy w /root/Temp/mod_ssl-2.8.14-1.3.27/
Sprawa jest prosta. Jeśli chcesz więcej szczegółów konfiguracyjnych -
odsyłam do pliku INSTALL. Wydajemy polecenie (pamiętaj o swoich ścieżkach):
./configure --with-apache = ../apache_1.3.27/
        --with-crt = /etc/ssl/apache/server.crt
        --with-key = /etc/ssl/apache/server.key


Tak, to wszystko w jednej linii. Teraz chyba nie muszę wyjaśniać co jest czym :)
He, he... to wszystko tutaj.


3) Apache

Wchodzimy teraz do katalogu z kodem źródłowym Apacza. W jednej linii piszemy:
SSL_BASE=../openssl-0.9.7b ./configure --enable-module=ssl
                 --prefix=/usr/local/apache --[różne inne Twoje opcje]
Tak jest, w jedej linii. Możesz dorzucić różne swoje opcje, np. coś z PHP,
MySQL itp. Oczywiście uważaj na ścieżki dostępu. Apacz spokojnie się configuruje...
Teraz pozostało: make i make install.

Teraz możemy plikom pozostawionym w /etc/ssl/apache/ dać chmod 400 :
cd /etc/ssl/apache/
chmod 400 *

Powinniśmy także wywalić pliki server* z kodu źródłowego Apacza - jeśli
kod ten sobie zostawiamy...
cd /root/Temp/apache_1.3.27/
rm conf/ssl.crt/server.crt
rm conf/ssl.key/server.key



Co dalej ?

Jesteś szczęśliwym posiadaczem Apacza z SSL. Nie wiesz jeszcze tylko czy działa.
W odpowiednim katalogu (u mnie /usr/local/apache/bin/) są odpowiednie pliki, aby
to sprawdzić. Na początek jeszcze kilka uwag:
  • zmień w httpd.conf użytkownika i grupę na odpowiednią (prawdopodobnie
    "nobody" i "nogroup" - choć nie jest to zalecane). Sprawdź także numer
    parametru "Port" (standardowo powinien być 80) oraz fragment kilka linijek
    niżej "IfDefine SSL": Listen powinien mieć wartość 80 oraz 443.
    Ładny kawałek dalej, przy deklaracji "VirtualHost _default_" także powinno
    wystąpić :443 (domyślnie jest chyba :8443).
  • Apacz w powyższej konfiguracji wykorzystuje
    certyfikaty z katalogu /usr/local/apache/conf/ssl.crt/ oraz klucze
    z katalogu /usr/local/apache/conf/ssl.key/ a także "prośby" z
    katalogu /usr/local/apache/conf/ssl.csr/. Sprawdź ich prawa :)
  • dorzuć do pliku /etc/services wpis:
    https 443/tcp
    https 443/udp
  • do uruchomienia Apacza z SSL użyj apachectl startssl
  • każda domena wirtualna wymaga osobnego klucza i certyfikatu
  • mod_ssl automatycznie dodal swój katalog z dokumentacją do manuala Apacza.
    Wystarczy napisać http://nazwa_hosta/manual/mod/mod_ssl
  • czytaj dokumentację mod_ssl'a oraz plik httpd.conf Apacza, żeby zrozumieć
    więcej i zyskać odpowiedzi na różne pytania.
  • nazwa plików server.* zostały podane "tak po prostu". W praktyce
    stosuje się nazwa_domeny.* lub jak tylko chcesz. Tutaj chodziło o to,
    żeby nie wprowadzać zamieszania. Oczywiście w przypadku
    takiej zmiany będziesz musiał odpowiednio modyfikować kolejne polecenia.

Dobra, co jeszcze... To cholerne hasło na początku. Wiem, niepotrzebny kłopot.
Żeby je wywalić, wchodzisz do katalogu z kluczem prywatnym serwera www:

cd /usr/local/apache/conf/ssl.key/
cp server.key server.key.old
openssl rsa -in server.key.old -out server.key
chmod 400 server.key

W ten sposób nie będziemy pytani o hasło przy starcie Apacza. Pamiętaj o
chmod 400 server.key
. Dobra, to by bylo chyba wszystko.

Mam nadziję, że udało się tobie zrobić to, z czym ja walczyłem 2 bite dni,
w o wiele krótszym czasie. Bez obrazy, ale prosze nie przysyłać do mnie pytań
o parametry w pliku httpd.conf dotyczące SSL. Wszystko znajduje się w
dokumentacji mod_ssl a ja ostatnio nie mam na nic czasu. Dlatego nie obrażaj
się, jeśli nie odpowiem na Twój list.

Może jeszcze na koniec...
1. Jak uruchomisz Apacza z SSL, po wydaniu polecenia ps x powinieneś zobaczyć
m.in. /usr/local/apache/bin/httpd -DSSL. Jeśli nie będzie tego -DSSL,
zapewne wpisałeś "apachectl start" zamiast "apachectl startssl".
2. Polecenie netstat -a |more powinno pokazać tobie przy
uruchomionym Apaczu z SSL zajęte (nasłuchujące) porty www(80) i https(443).
3. Zawsze możesz wykonać telnet localhost 443 i jeśli nie
zostaniesz odrzucony - coś tam siedzi na nim. Ciekawe co :)
4. Bardzo fajny sposób żeby sprawdzić czy SSL jest ok. to:
openssl s_client -connect localhost:443 -state -debug




Posłowie

Jest to pierwsza wersja tego dokumentu i zawiera pewnie
jakieś błędy/niedoróbki/potknięcia itp. Będę bardzo wdzięczny
za wszelkie uwagi, komentarze, poprawki, wyrazy wdzięczności.
Z góry przepraszam za powyższe i mam nadzieję, że będziecie mnie
informować w których miejscach coś nie gra.
Jako (częściowe) wytłumaczenie przedstawiam fakt, że większość tej
pracy powstawała w późnych godzinach nocnych.

Ostatnia wersja tego dokumentu znajduje się pod niżej wymienionym adresem.
Kontakt ze mną: linio@terramail.pl
Wesprzyj finansowo autora - kliknij tutaj


 
===============================
Henryk Liniowski, Poznań 2003
http://linio.terramail.pl
===============================