Zabezpieczenie witryny za pomocą Basic Authentication czy mod_auth_sql na pewno utrudnia dostęp do zasobów, które nie powinny byc dostępne publicznie, jednakże dla wytrawnego włamywacza, wyposażonego w odpowiednie narzędzia, nie stanowi to większej przeszkody. Dane są przesyłanie w postaci jawnej, a więc "wychodzą" z naszego komputera jako zwykły tekst w nagłówkach, które przeglądarka wysyła wraz z rządaniem do serwera. Przkładowy nagłówek może wyglądać tak:
GET /private/index.html HTTP/1.0
Host: localhost
Authorization: Basic dXNlcj1uYXN6ZV90YWpuZV9oYXNsbw==
Pod tym nic nie mówiącym ciągiem znaków kryję się nasz użytkownik wraz hasłem, jest on zakodowany bardzo słabym algorytmem base64 i jego oryginalna postać to "user:nasze_tajne_haslo", dokładny opis można znaleźć w dokumentach RFC1945, RFC2616 i RFC2617. Rozwiązaniem w tym wypadku pozostaje transmisja szyfrowana https.
Pierwszą czynnością jaką musimy zrobić jest instalacja mod_ssl(o ile go nie mamy) oraz openssl, który pozwoli nam samym tworzyć certyfikaty i je podpisywać. Kiedy już mamy wszystko, mod_ssl jest włączony (linijka LoadModule ssl_module modules/mod_ssl.so w httpd.conf, rozszerzenie w systemie Windows to dll), możemy przejść do następnej części, czyli utworzeni certyfikatu.
Aby utworzyć nasz pierwszy certyfikat musimy w konsoli wydać komende:
openssl req -new > testcert.csr
Program zada nam serie pytań, na które powinniśmy odpowiedzieć, przykładowo jeżeli chciałbym utworzyć certyfikat dla swojego bloga to wyglądałoby to mniej więcej tak:
[mephir@localhost crt]$ openssl req -new > testcert.csr
Generating a 1024 bit RSA private key
..............++++++
......++++++
writing new private key to 'privkey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:PL
State or Province Name (full name) [Berkshire]:zachodniopomorskie
Locality Name (eg, city) [Newbury]:Uniescie
Organization Name (eg, company) [My Company Ltd]:MePhiRBlog
Organizational Unit Name (eg, section) []:website
Common Name (eg, your name or your server's hostname) []:mephir.net.pl
Email Address []:admin@mephir.net.plPlease enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:tajnehaslo
An optional company name []:MePhiRBlog
Wszystkie odpowiedzi na pytania zadane przez program(tutaj pogrubione) należy zastąpić wartościami odpowienimi dla siebie.
Po zakończeniu działania programu otrzymamy dwa pliki privkey.pem(klucz prywatny) oraz testcert.csr(certyfikat), następną rzeczą jest usunięcie hasła z klucza. Jeżeli tego nie zrobimy możemy mieć problemy podczas np. automatycznego uruchamiania serwera po zaniku napięcia, bowiem Apache będzie za każdym razem prosił nas o hasło.
Usunięcie hasła z klucza dokonamy komendą:
openssl rsa -in privkey.pem -out testcert.key
Zostaniemy poproszeni o podanie hasła, które podawaliśmy na początku poprzedniego kroku:
[mephir@localhost crt]$ openssl rsa -in privkey.pem -out testcert.key
Enter pass phrase for privkey.pem:
writing RSA key
Nastepnym etapem będzie przekształcenie żądania certyfikatu w podpisany certyfikat:
openssl x509 -in testcert.csr -out testcert.cert -req -signkey testcert.key -days 3650
W wyniku wykonania programu otrzymamy nastepującą odpowiedź:
[mephir@localhost crt]$ openssl x509 -in testcert.csr -out testcert.cert -req -signkey testcert.key -days 3650
Signature ok
subject=/C=PL/ST=zachodniopomorskie/L=Uniescie/O=MePhiRBlog/OU=website/CN=mephir.net.pl/emailAddress=admin@mephir.net.pl
Getting Private key
Tym poleceniem utworzyliśmy certyfikat X.509 na podstawie wejściowego pliku testcert.csr z żądaniem certyfikatu. Dodatkowo nasz certyfikat został podpisany za pomocą klucza prywatnego testcert.key. Certyfikat będzie ważny przez dziesięć lat.
Kiedy wykonaliśmy już powyższe kroki, musimy utworzyć katalogi, w których będziemy przechowywać certyfikat, jak i klucz prywatny. W moim wypadku będzie to /etc/httpd/crt - na certyfikat oraz /etc/httpd/key - na klucz. Zmieniamy nazwę pliku testcert.cert na testcert.crt i przenosimy go do katalogu crt, a testcert.key do katalogu key. Potrzebujemy jeszcze miejsca w którym będziemy chcieli naszą "tajną stronę przechowywać" ja sobie upatrzyłem folder /var/www/sslsite. Musimy do niego wrzucić stronę, może to być prosty plik html np.:
SSLProtocol -all +TLSv1 +SSLv3. Opcja ta wymusza stosowanie najnowszym protokołów do przesyłu szyfrowanych danych. Więcej możliwych opcji jest dostępnych pod adresem http://httpd.apache.org/docs/2.0/mod/mod_ssl.html .
Poniżej znajduje się mój przykładowy plik konfiguracyjny vhosta dla phpMyAdmin(niektóre dane zostały zmienione):
Czasami nie mamy dostepu do konfiguracji serwera, a jednakże chcielibyśmy użytkownika zmusić aby korzystał z szyfrowanego połączenia, możemy tego dokonac w bardzo prosty sposób dodając do pliku .htaccess następujące linie: