Задача: Поставување на веб сервер кој сервира криптирани страни и има точно дефинирани клиенти кои мора да се автентицираат со нивните сертификати пред да и пристапат на содржината. Читав на оваа тема неколку текстови па да си ги архивирам во суштина командите на едно место пошто беа раштракани.
Значи целта е да се постави apache со SSL кое на https портот ќе сервира веб апликација. Пристапот се дозволува само ако прелистувачот на корисникот покаже валиден сертификат кој е издаден од нашиот сервер. Во исто време и нашиот сервер ја докажува автентичноста пред клиентот, но сертификатот на серверот го потпишуваме самите а не со некој светски авторитет бидејќи акцентот е клиентите да бидат доверливо автентицирани, а не серверот.
Постапката оди во неколку чекори:
Нема некоја филозофија, инсталирав веќе готов пакет за apache2 и openssl за Slackware. :)
Треба да се генерира приватен клуч за серверот со командата:
openssl genrsa -rand file1:file2:file3 -out sslserver.key 1024
Па генерирам барање за некој да го потпише (сертифицира) мојот клуч:
openssl req -new -key sslserver.key -out sslserver.csr
Бидејќи на корисниците не им е многу гајле дали сум 100% јас серверот доволно добро е сам да го потпишам клучот т.е. сам серверот да си биде авторитет од доверба за автентичноста на клучот. Потпишувањето т.е. издавањето сертификат оди со командата:
openssl x509 -req -days 365 -in sslserver.csr -signkey sslserver.key -out sslserver.crt
Тоа е тоа околу клучевите за серверот, имам sslserver.crt датотека која ми преставува сертификат за автентичност на веб серверот. Подоцна ќе ги ставам потребните линии во httpd.conf
Сега ќе генерирам клуч за еден корисник, ќе го потпишам тој клуч со серверот, ќе генeрирам pkcs12 датотека која потоа се увезува во прелистувачот на корисникот за да може да се идентификува корисникот секој пат кога серверот ќе побара тој да се идентификува.
Генерирам приватен клуч за корисникот и генерирам барање за издавање на сертификат:
openssl genrsa -rand file1:file2:file3 -out korisnik1.key 1024 openssl req -new -key korisnik1.key -out korisnik1.csr
Сега го зимам барањето од корисникот и го потпишувам со клучот на серверот:
openssl x509 -req -days 365 -CA sslserver.crt -CAkey sslserver.key -in korisnik1.csr -out korisnik1.crt
Добив сертификат кој вели дека корисник1 е навистина регистриран со серверот како корисник1. Сега корисникот треба да го спои овој сертификат со својот приватен клуч за на крај да се добие .p12 датотека:
openssl pkcs12 -export -clcerts -in korsinik1.crt -inkey korisnik1.key -out korisnik1.p12
Оваа korisnik1.p12 датотека треба да се увезе во прелистувачот на корисникот за да се издава секој пат кога серверот ќе побара од клиентот да се автентицира. Во Фајрфокс се оди во Преференции->Напредно->Сертификати, па се одбира Уреди ги сертификатите->Внеси.
Сега имам клучеви за серверот и барем за еден корисник и треба да направам виртуелен хост кој ќе ги опслужува веб страните преку SSL.
httpd.conf треба да го има вчитано mod_ssl модулот, плус да има нешто вака:
Listen 443 SSLSessionCache dbm:/var/run/ssl_scache SSLSessionCacheTimeout 300 SSLMutex file:/var/run/ssl_mutex SSLRandomSeed startup builtin SSLRandomSeed connect builtin AddType application/x-x509-ca-cert .crt AddType application/x-pkcs7-crl .crl VirtualHost *:443 ServerName sslserver.com.mk DocumentRoot /var/www/htdocs SSLEngine on # Serveer avtentikacija SSLCertificateFile /etc/apache2/sslserver.crt SSLCertificateKeyFile /etc/apache2/sslserver.key # Klient avtentikacija SSLVerifyClient require SSLVerifyDepth 1 SSLCACertificateFile /etc/apache2/ssl.crt/sslserver.crt /VirtualHost
Уште треба да се изменат почетните скрипти за стартување на Apache да наместо „apachectl start“, го повикуваат „apachectl startssl“ и му пристапува на сајтот преку https://sslserver.com.mk
Манa е што може да се конфигурира само еден(првиот што ќе го впишам во httpd.conf) Apache NameBasedVirtual хост кој ќе се опслужува од https(443) портата, ако сакам повеќе веб страни треба да ги врзам или по различна IP адреса или на друга порта.
Дополнителна литература: Сервер клучеви, Клиент клучеви и Вовед во SSL.