Apache-SSL poza funkcjami zwykłego Apache'a udostępnia
możliwość
szyfrowania połaczenia z klientem przy pomocy SSL.
Wykorzystuje
się to wszędzie tam, gdzie przesyłane dane NIE MOGĄ być przechwycone przez osoby
trzecie (czyli przy przesyłaniu poufnych danych, w tym haseł) odwołanie do
serwera serwujacego witrynę w bezpiecznym połączeniu wygląda
nastepujaco:
https://www.domena.pl/, a połączenie jest kierowane na port 443
serwera
w przeciwieśstwie do portu 80 przy połaczeniach
nieszyfrowanych.
Więcej na ten temat znajdziesz na stronie www.apache-ssl.org .
2.Instalacja bazy MySQLPo ściągnięciu bazy danych kopiujemy ją do katalogu /usr/local/src a później rozpakowujemy
# cp mysql-3.23.58.tar.gz
/usr/local/src
# cd /usr/local/src
# tar zxf
mysql-3.23.58.tar.gz
# cd mysql-3.23.58
Teraz możemy zająć się konfiguracją, kompilacją i inicianizacją bazy
A. Konfiguracja
# ./configure --prefix=/usr/local/mysql
--with-charset=latin2
B. Kompilacja
# make
C. Instalacja
# make install
UWAGA:
umieść scieżkę /usr/local/mysql/lib/mysql w
pliku /etc/ld.so.conf i odpal ldconfig, bo inaczej PHP sie nie odpali (czyli
Apache nie wystartuje).
D. Inicjacja baz danych
# /usr/local/mysql/bin/mysql_install_db
Zostanie utworzony katalog: /usr/local/mysql/var wraz z
bazami: mysql oraz test
Trzeba jeszcze zmienić użytkownika i/lub prawa
dostepu do tego katalogu:
# chown mysql /usr/local/mysql/var
-R
E. Teraz możemy uruchomić naszą baze
# /usr/local/mysql/bin/safe_mysqld
I sprawdzamy czy działa
# /usr/local/mysql/bin/mysqladmin
ping
Jeżeli zwróci nam wartość >mysqld is alive <= znaczy że działa
F. Instalacja skryptów startowych
# cp /usr/local/mysql/share/mysql/mysql.server
/etr/rc.d/rc.mysql
# echo "/etc/rc.d/rc.mysql start" >>
/etc/rc.d/rc.local
G. Ostatnim krokiem bedzie ustawienie hasła administratora
# /usr/local/mysql/bin/mysqladmin -u root password tu_wpisz_nowe_hasło
H. Teraz możemy sprawdzić czy wszystko działa logujemy sie do bazy
# cd /usr/local/mysql/bin
# ./mysql -u root
-p
(tu podajemy nasze hasło które ustawiliśmy wyżej)
3.Instalacja openSSL
I znów przenosimy nasze zródło do katalogu /usr/local/src/ i tam rozpakowujemy
# cp openssl-0.9.7c.tar.gz
/usr/local/src
# tar zxf openssl-0.9.7c.tar.gz
A. Konfiguracja
# ./config
B. Kompilacja
# make
C. test
# make test
D. Instalacja
# make install
4.Generacja Certyfikatu dla naszej witrynyUWAGA: standardowo ważność wystawianego certyfikatu dla instytucji certyfikujacej, jak i zwykłego certyfikatu dla strony WWW to rok (365 dni) czyli jak wystawimy sobie certyfikat dla naszej instytucji certyfikujacej, a kilka minut pozniej certyfikat dla jakies witryny WWW, to ważność certyfikatu dla witryny będzie przekraczać termin ważności certyfikatu instytucji, która będzie wystawiać ten certyfikat ...MSIE wyrzuci wykrzyknik, że mu to nie odpowiada.
Aby temu zapobiec - zedytuj plik
/usr/loca/openssl/ssl/misc/CA.sh i popraw linie nr 87.
Jest tam:
-out
${CATOP}/$CACERT $DAYS
zamień te linie na:
-out ${CATOP}/$CACERT -days
1024
wtedy certyfikat wystawiany dla instytucji certyfikującej
będzie miał ważność około 3 lat, a ważnosć certyfikatów dla witryn pozostaje bez
zmian - 1 rok.
...i już MSIE nie będzie się burzył (przynajmniej z tego
powodu)
- Tworzymy certyfikat dla instytucji certyfikującej,
którym to certyfikatem będzie można podpisywać certyfikaty dla witryn.
Wydaj
polecenie: (będąc dalej w /usr/local/openssl/ssl/misc)
# ./CA.sh -newca
skrypt zapyta się o nazwę pliku, w którym ma utworzyć certyfikat (kliknij - zostanie nadana domyślna nazwa)
następnie trzeba podać kilka danych, które będą zapisane w certyfikacie (kod kraju, województwo, miasto, nazwę Twojej instytucji, e-maila i takie tam), no i hasło,
Po zakończeniu działania skryptu zostanie utworzony
katalog ./demoCA
oraz kilka plików i podkatalogów.
Nas będą interesować
tylko pliki:
./demoCA/cacert.pem - certyfikat naszej instytucji
certyfikującej
./demoCA/private/cakey.pem - klucz prywatny powyższego
certyfikatu
Tworzymy następnie certyfikat dla witryny internetowej
(dla każdej witryny SSL-owej generuje się osobny certyfikat, ponieważ nazwa
zawarta w certyfikacie musi się zgadzać z nazwą domenową strony internetowej,
dla której tworzymy certyfikat. W przeciwnym wypadku ukochany MSIE rzuci
wykrzyknikiem przy wejąciu na taką stronę, że "Nazwa zawarta w certyfikacie nie
zgadza się z nazwą strony".
Wydajemy polecenie:
# ./CA.sh -newreq
podajemy hasło, jakie
chcemy mieć dla wygenerowanego klucza prywatnego,
oraz kilka danych na temat
certyfikatu. (jak poprzednio).
Uwaga: Ważne jest, aby przy 'Common Name (eg, Your Name)
[]:'
podać nazwę domenową strony, dla której jest tworzony certyfikat.
(w
przeciwynym wypadku MSIE wyrzuci wyżej wspomniany wykrzyknik)
Zostanie utworzony plik ./newreq.pem, który trzeba
"podpisać" w instytucji certyfikującej. Instytucji takich jest "kilka" na
Inecie, ale za podpisanie takiego certyfikatu płaci się około 125 USD (mogę się
mylić).
Ale nie zawsze jest potrzeba posiadania certyfikatu wystawionego
przez taką firmę, dlatego też możemy sami sobie podpisać swój certyfikat. (po to
własnie wczęsniej utworzylismy certyfikat instytucji certyfikującej)
Więc podpisujemy nasz nowy certyfikat w (naszej) instytucji certyfikującej wydajac polecenia
# ./CA.sh -sign
Skrypt poprosi nas teraz grzecznie o hasło do klucza prywatnego instytucji certyfikującej, następnie dwa razy potwierdzamy "y" i dostajemy pikny podpisany certyfikat dla naszego sajta ;-) są nimi dwa pliki:
./newcert.pem - certyfikat dla strony
internetowej
./newreq.pem - klucz prywatny dla powyższego
certyfikatu
Jeszcze tylko pomocne (opcjonalnie) może być usunięcie
hasła z klucza prywatnego naszego certyfikatu, gdyż wtedy unikniemy pytania o
hasło przy starcie apache-ssl'a.
Hasło z klucza prywatnego usuwa się wydając
polecenie:
# $openssl rsa -in newreq.pem -out
newreq.pem
czyli mamy 4 pliki, ktore nas interesuja z calego
katalogu ./demoCA:
./demoCA/cacert.pem - certyfikat naszej
instytucji certyfikujacej
./demoCA/private/cakey.pem - klucz
prywatny naszej instytucji certyfikujacej
./newcert.pem -
certyfikat dla witryny internetowej
./newreq.pem - klucz
prywatny certyfikatu dla witryny
Kopiujemy zródła apache-1.3.28.tar.gz do /usr/local/src rozpakowójemy i patchujemy naszego apache
# cp apache-1.3.28.tar.gz
# tar
zxf apache-1.3.28.tar.gz
# cd apache-1.3.28
# cp
apache-1.3.28+ssl_1.49.tar.gz /usr/local/src/apache-1.3.28
# tar
zxf apache-1.3.28+ssl_1.49.tar.gz
# ./FixPatch
zapyta nas o 2
rzeczy na pierwszą odpowiadamy nie 'N' a zaś drugą tak 'Y'' i apache zostaje
spatchowany ;>
A. Konfiguracja
# ./configure
# --prefix=/usr/local/apache-ssl
# --activate-module=src/modules/php4/libphp4.a
# --enable-module=rewrite
# --enable-shared=rewrite
B. Kompilacja
# make
C. Instalacja
# make install
D. Skrypty startowe
# cp /usr/local/apache-ssl/bin/httpsdctl
/etc/rc.d/rc.httpsd
# echo "/etc/rc.d/rc.httpsd start >>
/etc/rc.d/rc.local"
Teraz już mamy apache-ssl z mysql ale jeszcze pozostał nam php więc do dzieła
6.Instalacja PHP
No i jak zwykle zródła do /usr/local/src
# cp php-4.3.4.tar.gz
/usr/local/src
# tar zxf php-4.3.4.tar.gz
# cd
php-4.3.4
A. Konfiguracja
# ./configure --prefix=/usr/local/php
# --with-apxs=/usr/local/apache-ssl/bin/apxs
# --enable-track-vars
# --mysql=/usr/local/mysql
# --with-config-file-path=/usr/local/apache-ssl/conf
B. Kompilacja
# make
C. Instalacja
# make install
Teraz należało by skopiować plik php.ini na swoje miejsce czyli do /etc
# cp /usr/local/src/php-4.3.4/php.ini-dist
/etc/php.ini
Mógłbym długo opisywać jak konfigurować apacha z obsluga SSL czy bez, ale postram tu naj najkrócej pokazać co gdzie wpisać zeby zadzialało wiec do dzieła ;)
Gotowy plik konfiguracyjny z obsluga SSL jest dostepny
pod adresem http://krycha.gda.pl/linux/howto/httpsd.conf
uprzedzam iż
najbardziej jak mogłem go skróciłem tzn pozbawiłem go zbędnych jak dla mnie
komentarzy i odstępow pomiedzy wierszami więc ni jest super czytelny dla
wszystkich ale grunt ze działa i jest sprawdzony - ale to dla tych którzy chcą
mieć szybko zrobiony plik konfiguracyjny.
Domyślnie plik konfiguracyjny Apache ma nazwę httpsd.conf (niby słusznie), ale chłopaki zapomnieli więc spaczować fragment Apacha, by ten korzystał z pliku o takiej własnie nazwie - Apache-SSL odwołuje się do pliku httpd.conf przy uruchomieniu...którego nie ma.
Wiec tworzymy link symboliczny:
# cd
/usr/local/apahe-ssl/conf
# ln -s httpsd.conf httpd.conf
i już Apache przy starcie nie będzie krzyczał z tego powodu ;-)
Teraz przechodzimy do edycji naszego apacha /usr/local/apache-ssl/conf/httpsd.conf
Na poczatku dodajemy poniższe linijki najlepiej przed dodaniem modułów
Potrzebne dla nasłuchiwania na tych portach 443 - jest
standardowym portem dla SSL'a
Listen 80
Listen 443
Potrzebne by załadować moduly dla php'a
LoadModule
rewrite_module libexec/mod_rewrite.so
LoadModule php4_module
libexec/libphp4.so
Teraz odnajdujemu sekcje gdzie dodawane są moduły i
sprawdzamy czy na końcu mamy taki wpis jak nie to dopisujemy
AddModule
mod_php4.c
Teraz ustawiomy poniższe zmienne
Port 80
User nobody
Group nobody
ServerAdmin
admin@domena.pl
ServerName domena.pl
No to na koniec nasze virtualki
NameVirtualHost *:80
NameVirtualHost
*:443
Powyższe deklaracje MUSZĄ BYĆ. Wiele osób pomija je dziwiąc się
potem,
że poniższe konfiguracje Virtualek nie działają...
Teraz definiujemy virtualki z obsluga SSL'a
DocumentRoot
/usr/local/apache-ssl/htdocs/jakis_katalog/
ServerName
domenazssl.pl
ServerAlias www.domenazssl.pl
Redirect /
https://www.domenazssl.pl:443/
ServerAdmin
adimn@domenazssl.pl
DocumentRoot
/usr/local/apache-ssl/htdocs/jakis_katalog/
ServerName
domenazssl.pl
ServerAlias www.domenazssl.pl
ErrorLog
/usr/local/apache-ssl/logs/domenazssl-error_log
CustomLog
/usr/local/apache-ssl/logs/domenazssl-access_log
common
SSLEnable
SSLCACertificatePath
/usr/local/apache-ssl/conf
SSLCACertificateFile
/usr/local/apache-ssl/conf/ssl/cacert.pem
SSLCertificateFile
/usr/local/apache-ssl/conf/ssl/newcert.pem
SSLCertificateKeyFile
/usr/local/apache-ssl/conf/ssl/newreq.pem
SSLCacheServerPort
8080
SSLCacheServerPath
/usr/local/apache-ssl/bin/gcache
SSLSessionCacheTimeout
10000
RewriteEngine on
RewriteCond %(REQUEST_METHOD)
^(TRACE|TRACK)
RewriteRule .* - [F]
Dzięki takiemu rozwiązaniu chcąc wejsc na
strone
https://www.domenazssl.pl:500/,
wystarczy, wpisać
http://www.domenazssl.pl/,
a serwer apache (bez obsługi SSL) przekieruje Cię
na ten pierwszy adres. I już nie musisz martwić się zapamiętywaniem numerów
portów dla witryn SSL, jeżli masz ich wiele.
A to virtualka bez obslugi SSL'a
ServerAdmin
admin@domenabezssl.pl
DocumentRoot
/usr/local/apache-ssl/htdocs/jakis_katalog/
ServerName
domenabezssl.pl
ServerAlias www.domenabezssl.pl
ErrorLog
/usr/local/apache-ssl/logs/domenabezssl-error_log
CustomLog
/usr/local/apache-ssl/logs/domenabezssl-access_log
common
SSLDisable
Jedyną (znaczącą) różnicą w konfiguracji Virtualek z SSL
i bez SSL na tym samym Apache'u jest dyrektywa SSLEnable/SSLDisable.
To
własnie ta dyrektywa decyduje o tym, czy dana Virtualka ma być obsługiwana przez
bezpieczny (jak narazie ;P) protokół SSL, czy też nie.
Na koniec sprawdzamy czy wszystko gra
# /etc/rc.d/rc.httpsd configtest
jak nam
zwroci wartosc "Syntax OK" oznacz ze jest git i możemy odpalac
apache-ssl
# /etc/rc.d/rc.httpsd start
Jak by się pojawiły jakieś problemy zapraszam do logow - log fun !!! "/usr/local/apache-ssl/log/"To juz chyba koniec mam nadzieje że o niczym nie zapomniałem ;)) w razie czego sprawdzony i dzialajacy skrypt konfiguracyjny dostepny pod adresem http://krycha.gda.pl/linux/howto/httpsd.conf