On-Line Библиотека www.XServer.ru - учебники, книги, статьи, документация, нормативная литература.
       Главная         В избранное         Контакты        Карта сайта   
    Навигация XServer.ru






 

Прикручиваем SSL на Apache

Вячеслав Калошин

 
Итак, мне потребовалось прикрутить к моему WWW-серверу SSL. Ситуация осложнялась 
тем, что я не мог уйти с версии 1.3.9 Apache, так как под более новыми не 
компилировались нужные мне модули.


Сначала нам необходим сам Apache. Если у вас уже есть собранное и работающее 
дерево apache, то скопируйте его в безопасное место. Если нет, то вытяните самую 
последнюю версию Apache и разверните его.


Одновременно я собирал SSL для 1.3.12 и 1.3.9 версии Apache.


Для версии 1.3.9 необходимо взять следующие файлы.
http://www.modssl.org/source/mod_ssl-2.4.10-1.3.9.tar.gz
ftp://ftp.openssl.org/source/openssl-0.9.4.tar.gz


Для 1.3.12
ftp://ftp.modssl.org/source/mod_ssl-2.6.4-1.3.12.tar.gz
ftp://ftp.openssl.org/source/openssl-0.9.5a.tar.gz


Обратите внимание на различия в версиях.


Ниже я буду в скобках давать команды для 1.3.12. Все файлы лежат в одном 
каталоге. В нем же лежит дерево Apache.


gzip -d -c mod_ssl-2.6.4-1.3.9.tar.gz | tar xvf -
(gzip -d -c mod_ssl-2.6.4-1.3.12.tar.gz | tar xvf -)
gzip -d -c openssl-0.9.4.tar.gz | tar xvf -
(gzip -d -c openssl-0.9.5a.tar.gz | tar xvf -)


Этими командами мы распаковали все пакеты.


cd openssl-0.9.4
(cd openssl-0.9.5a)
./config

make


Отконфигурировали и собрали openssl, пакет, который и будет обеспечивать 
шифрование. Я рекомендую дать еще команду make install, после которой в 
/usr/local/ssl будет лежать это пакет.


cd ..
cd mod_ssl-2.6.4-1.3.9
(cd mod_ssl-2.6.4-1.3.12)


./configure --with-apache=../apache_1.3.9 --with-ssl=../openssl-0.9.4 --
prefix=/usr/local/apache


(./configure --with-apache=../apache_1.3.12 --with-ssl=../openssl-0.9.5a --
prefix=/usr/local/apache)


Этой командой мы включили mod_ssl в число собираемых модулей для Apache.


Теперь просто перейдите в каталог с Apache и скажите make - все необходимые 
модули будут собраны. Так же, если у вас раньше были собраны нестандартные 
модули, как у меня, они никуда не исчезнут и будут тоже вкомпилированы.


make certificate


Этой командой вы сгенерируете тестовые сертификаты, так что тут вы можете не 
особо думать над вопросами, можно просто давить Enter и вводить самые тупые 
пароли.


make install


Этой командой вы инсталлируете Apache в предназначенное для него место 
(/usr/local/apache).



Все, можете попробовать запустить apache командой



/usr/local/apache/bin/apachectl startssl



Если все запустилось (по команде ps ax|grep ht появляются httpd -DSSL), то 
можете себя поздравить - оно собралось. Попытка обратиться к хосту по протоколу 
https не даст вам ничего, так как сам Apache еще не сконфигурирован.


Итак, начнем конфигурировать, открываем в редакторе файл httpd.conf.



Listen 443
NameVirtualHost x.x.x.x:443



Эти команды указывают Apache слушать 443 порт (стандартный порт для https)и 
обслуживать на нем виртуальные серверы.


Теперь добавляем описание виртуального сервера.





SSLEngine on
SSLCertificateFile /usr/local/apache/conf/ssl.crt/server.crt
SSLCertificateKeyFile /usr/local/apache/conf/ssl.key/server.key
SSLLog /usr/local/apache/logs/ssl_engine_log
SSLLogLevel warn
SSLOptions +StdEnvVars


......





Вместо многоточия напишите остальные директивы, которые обычно указываются в 

этом месте.


Теперь можно попробовать перезапустить сервер. Опс, при запуске Apache требует 
ввести парольную фразу. Конечно, первый раз такое можно пережить, но такое 
поведение неприемлемо для рабочего сервера.


Входим в каталог с ssl.key
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key 

Вводим пароль для дешифровки


chmod 400 server.key


И закрываем файл с отрытым ключом от посторонних глаз, все сервер больше не
будет спрашивать пароль. На данном этапе уже должен работать SSL на полную 
катушку. То есть, набирая https://host вы должны получать запрос браузера на 
использование этого сертификата.


Для того, что бы в дальнейшем облегчить нам жизнь, подредактируем немного 
bin/apachectl файл. Исправим в нем условие start на startold, а startssl на 
просто start. Затем скопируем его в /etc/rc.d/init.d/httpd. Теперь по умолчанию 
при загрузке сервера, будет запускаться Apache с поддержкой SSL.


Чтобы не мучаться с PATH, сделаем, чтобы openssl запускался нормально.


cd /usr/local/bin
ln -s /usr/local/ssl/bin/openssl openssl 




Итак, теперь будем генерировать нормальные сертификаты, без всяких SnakeOil.


Генерируем ключ.


openssl genrsa -des3 -out server.key 1024 


На данном этапе мы создали server.key, теперь генерируем запрос в службу 
верификации.


openssl req -new -key server.key -out server.csr


Будьте аккуратны в ответах, ведь это потом увидят все. Если ошиблись, все можн 
повторить заново. Да, не ошибитесь, CommonName - это адрес хоста без http://


Все, если вы получили следующую надпись, то запрос сгенерирован правильно


You now have to send this Certificate Signing Request (CSR)
to a Certifying Authority (CA) for signing


Но мы не буржуи, подписывать у нас некому, поэтому мы будет сами
подписывать себя. Хотя если у вас есть деньги и вам необходимо подписать свой 
сертификат именно у глобальных авторизационных центров, то на modssl.org Вы 

найдете все необходимые адреса и ссылки.


openssl genrsa -des3 -out ca.key 1024
openssl req -new -x509 -days 365 -key ca.key -out ca.crt


Генерируем подпись авторизационного центра на год (можно и на больше), процедура 
полность схожа с генерацией ключа.


Копируем sign.sh из pkg.contrib из пакета mod_ssl в каталог с ключами


И подписываем свой же запрос
./sign.sh server.csr


Получив напись, содержащую


Now you have two files: server.key and server.crt. These now can be used as 
following


Начинаем радоваться, все собрано так, как надо. Копируем server.key и server.crt 
на место старых, но в каталоге c crt файлом Makefile не трогаем. Скопировав 
новый .crt файл, наберите make в этом же каталоге - он создаст некий хеш файл.


Все, теперь перезапустите Apache и можете наслаждаться тем, что вы сделали 
собственный WWW сервер, защищенный с помощью SSL.


Проверить защищенность вы можете посмотрев информацию о сертификатах или 
соединении в info-окнах браузеров. Если вы им не доверяете, то дайте команду 


openssl s_client -connect localhost:443 -state -debug


Она выведет полностью всю информацию, которую она сможет выжать из вашего SSL 
сервера.


Теперь о неприятном: к сожалению, я пока не смог разобраться, почему иногда 
проскакивают ошибочные сообщения для версии Apache 1.3.9 (НЕ для 1.3.12 - с ним 
все в порядке).


Например, вышеприведенная команда для версии 1.3.9 возвращает ошибку, говоря о
неправильной версии протокола, а для 1.3.12 отрабатывает нормально. Последняя 
версия openssl (0.9.5a) вообще не захотела компилироваться с 1.3.9, пришлось 
ставить 0.9.4. Конечно, путем грязного хака я заставил 0.9.5а компилироваться, 
но это неправильно (кстати, MSIE отказывался работать с этим хаком, когда NN 
соединялся без проблем). Во всех конференция рекомендуют брать самые последние 
версии всех трех пакетов. Скорее всего, если поподбирать версии, все соберется и 
будет работать вообще без ошибок. А с другой стороны - ну и что, что вот такие 
вот утилиты ругаются, tcpdump или любой другой анализатор трафика показывает, 
что соединение зашифровано. Что нам и требовалось



Литература по Apache