Apache+SSL

Оригинал этой статьи находится на сервере "LinuxNews.Ru".

Итак, мне потребовалось прикрутить к моему 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)и 
обслуживать на нем виртуальные серверы.

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

<VirtualHost x.x.x.x:443>
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

......
</VirtualHost>

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

Теперь можно попробовать перезапустить сервер. Опс, при запуске 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 или любой другой анализатор трафика показывает, 
что соединение зашифровано. Что нам и требовалось

(с) 2000 Вячеслав Калошин multik@sw.ru


 Main  Books  Ukraine  Immigration  Search  Разное  SYSTEM


Украинская баннерная сеть

Hosted by   elektrod.com.ua