From: Бульба Сергей <bas@vulcan.ru.>
Newsgroups: email
Date: Mon, 9 Nov 2008 17:02:14 +0000 (UTC)
Subject: Установка и настройка Apache и подписанных SSL-сертификатов
От автора
В связи с тем, что иногда приходится изучать кучу документации,
тестировать и пробовать различные подходы, то тратится куча времени.
Очень часто приходится бороздить просторы OpenNET'а, поэтому я решил,
что накопленный опыт целесообразно выкладывать именно сюда, чтобы и мне
было проще и оно наверное ещё кому пригодится. Так же очень часто статьи
вроде бы уже об изученных вещах очень удачно переписываться и
дополняются под новые версии программного обеспечения. Хотелось бы
добавить, что так как статья писалась по горячим следам мне необходимых
вещей, то и описывать я буду свой пример, т.е. разговаривать о
виртуальных примерах и ситуациях я не намерен. На основе данной статьи
можно заточить настройку web-сервера под свои нужды без особых проблем.
Введение
Со временем наступает момент, когда трафик от сервера к клиенту
необходимо (или хотелось бы) шифровать. В моём случае это потребовалось
для самописной системы, в которой проскакивали логины и пароли
пользователей. Поэтому было решено использовать связку apache + mod_ssl.
Используемое ПО
FreeBSD 7.0
Apache 2.2.9
Установка Apache
Не люблю изобретать велосипед и выдумывать, если что-то придумано до меня,
поэтому в установке ПО во FreeBSD я использую систему портов. Так же
местоположение конфигов я не изменяю и оставляю по умолчанию.
Устанавливаем Apache:
# cd /usr/ports/www/apache22
# make install clean
При установке Apache первый раз появится диалоговое окно с выбором
модулей. Необходимо проверить, что модуль SSL выбран (находится почти в
самом низу). Остальные модули можно включить/отключить под свои нужды.
После мы нажимаем "Ok" и ждём окончания компиляции и
установки.
Создание SSL-сертификатов
После установки web-сервера и перед его конфигурированием нам необходимо
создать ssl-сертификаты. Создавать их мы будем в папке с конфигами
Apache. Для создания сертификатов нам потребуется ряд данных. Первое,
что нам потребуется - это пароль. Как всегда придумываем что-нибудь
длинное и сложное. В нашем примере пусть это будет "agu7Lirithiunee".
При выполнении третьей команды нам необходимо будет заполнить небольшую
анкету. По сути, можно постоянно нажимать Enter, но есть поля, которые
заполнить всё же необходимо. Я бы рекомендовал не лениться, а заполнять
все поля. Так же необходимо заметить, что файл server.csr нам
потребуется для получения подписанного сертификата.
Common Name (eg, YOUR name) []: www.domain.ru - заполняем полным
доменным именем нашего сервера, для которого мы получаем сертификат.
Email Address []: user@domain.ru - указываем свой адрес электронной почты.
Дополнительные (extra) поля не заполняйте!
По завершению у нас будет создано 4 файла: server.crt, server.csr, server.key, server.pem.
По сути, на этом можно и остановиться: web-сервер уже сможет работать по
ssl, но мы столкнёмся со следующими проблемами:
1) Полученные сертификаты не являются подписанными, поэтому браузеры
будут на них ругаться, что в свою очередь приведёт к тому, что
пользователю потребуется выполнять ряд действий. Так как не все
пользователи поймут, что от них надо они попросту забьют тревогу,
закроют страницу и всё.
2) Вполне возможно, что нам просто необходимы валидные сертификаты,
поэтому нам не подойдут неподписанные, так как они не будут отвечать
всем требованиям по безопасности.
Выдачей подписанных сертификатов занимается ряд сервисов в интернете. К
счастью есть и такие, которые дают подписанные сертификаты бесплатно:
http://www.freessl.su - сроком на 1 месяц
http://www.instantssl.com/ssl-certificate-products/free-ssl-certificate.html - сроком на 3 месяца
1. Зайдя на http://www.instantssl.com/ssl-certificate-products/free-ssl-certificate.html
нажимаем на кнопку Get It Free Now!
2. В предложенной форме в первое поле мы копируем содержимое файла с
расширением CSR (копируем полностью).
3. Во втором поле выбираем пункт Apache-ModSSL.
4. Нажимаем Next.
5. Выбираем, на какой адрес высылать сертификаты.
6. Нажимаем Confirm & Continue.
7. В следующей форме заполняем все поля, выделенные красным цветом.
Особое внимание обратите внимание на Admin Contact email - это наш
адрес, на который придут уведомления и сертификаты. Так же нас будут
интересовать поля из раздела Choose your Admin Contact's Management
Details - это наши логин и пароль в данной системе.
8. Нажимаем Agree & Continue.
После этого к нам на e-mail придёт уведомление, что мы зарегистрированы
и что на адрес администратора домена выслан запрос на подтверждение. Так
как у меня стоит перенаправление со служебных адресов (admin, root,
webmaster), то я получаю сразу оба письма. В одном из них будет ссылка
на форму подтверждения и код активации. Когда мы введёт оставшиеся
данные к нам на почту придёт архив с двумя сертификатами, которые мы
должны скопировать к ранее созданным сертификатам. После чего мы можем
продолжить конфигурирование web-сервера.
Конфигурирование Apache
Для запуска Apache с SSL добавляем следующие строки в конфиги:
Третья строка необходима для того, чтобы при запуске не появлялась ошибка:
[warn] (2)No such file or directory: Failed to enable the 'httpready' Accept Filter
Четвёртая строка необходима для того, чтобы не перегружать сервер, так
как FreeBSD позволяет динамически подгружать/выгружать модули ядра. Для
проверки, что модуль загрузился смотрим вывод команды kldstat.
Проводим стандартную настройку httpd.conf:
1) Указываем e-mail админа:
ServerAdmin webmaster@domain.ru
2) Указываем имя сервера и не забудьте раскомментировать строчку:
ServerName www.domain.ru:80
3) Раскомментируем поддержку виртуальных хостов:
Include etc/apache22/extra/httpd-vhosts.conf
4) Раскомментируем поддержку ssl:
Include etc/apache22/extra/httpd-ssl.conf
После этого приступим к конфигурированию httpd-ssl.conf:
1) Для того, чтобы запуск web-сервера выполнялся автоматически и не
останавливался на запрос пароль ssl-сертификатов, то заменяем
a.b.c.d - IP-адрес виртуального хоста. Обратите внимание на директивы
SSLCertificateFile и SSLCACertificateFile - это как раз те директивы,
которые указывают на полученные и подписанные ssl-сертификаты.
3) Создаём скрипт echo в папке /usr/local/etc/apache22, который будет
отвечать Apache на запрос пароля сертификатов следующего содержания:
4) Создаём обычный виртуальный хост. Для этого редактируем конфиг
httpd-vhosts.conf. Примеры виртуальных хостов я комментирую, так как
пользуюсь минимальным набором директив.
Важное дополнение. В связи с тем, что сертификаты подписываются на конкретный домен,
то у нас будет проблема, в случае нескольких алиасов для сервера или если сервер
доступен с локальной сети под одной адресацией/алиасом, а с интернета - под другими.
Самый верный способ - сделать перенаправление. Способов сделать много, покажу тот,
который использует файл .htaccess и mod_rewrite.
1) Открываем для редактирования конфиг httpd-vhosts.conf.
2) Разрешаем опцию AllowOverride, для этого меняем содержимое виртуального хоста
на ниже следующее:
3) Далее нам необходимо создать файл .htaccess в директории нашего сайта содержащий
такой код:
RewriteEngine on
Redirect / https://www.domain.ru/
Не наступите на те же грабли, что и я как-то. Если у вас защищаемый контент находится
по адресу http://www.domain.ru/dir, то всё равно строчка редирект будет выглядить
как написано выше.
Редактирование конфигов завершено. Теперь мы можем запустить Apache:
[root@domain /usr/local/etc/apache22/]# /usr/local/etc/rc.d/apache22 start
Performing sanity check on apache22 configuration:
Syntax OK
Starting apache22.
После этого заходим через браузер на страницу http://www.domain.ru и
видим It works! Стандартный протокол передачи работает. Для проверки ssl
заходим по адресу https://www.domain.ru. В зависимости от
браузера должен появится или замочек, или название сертификата, при
клике на который будет писаться, что "подключение безопасно" или
"подключение использует шифрование".