Tuesday, October 17th, 2017

Установка и настройка Apache и подписанных SSL-сертификатов

Published on Март 30, 2009 by   ·   Один комментарий

От автора

В связи с тем, что иногда приходится изучать кучу документации,
тестировать и пробовать различные подходы, то тратится куча времени.
Очень часто приходится бороздить просторы 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».

        # cd /usr/local/etc/apache22
        # openssl genrsa -des3 -rand /dev/random -out server.key 1024
        # openssl rsa -in server.key -out server.pem
        # openssl req -new -key server.key -out server.csr
        # openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

При выполнении третьей команды нам необходимо будет заполнить небольшую
анкету. По сути, можно постоянно нажимать 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 добавляем следующие строки в конфиги:

        # echo "apache2_enable=YES" >> /etc/rc.conf
        # echo "apache2ssl_enable=YES" >> /etc/rc.conf
        # echo "accf_http_load=YES" >> /boot/loader.conf
        # kldload accf_http

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

     [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-сертификатов, то заменяем

SSLPassPhraseDialog builtin

на

SSLPassPhraseDialog exec:/usr/local/etc/apache2/echo

2) Изменяем секцию виртуального хоста под свои нужды. В конфиге много
комментариев, поэтому я приведу только то, что должно быть.

        <VirtualHost a.b.c.d:443>
            DocumentRoot "/usr/local/www/apache22/data"
            ServerName www.domain.ru:443
            SSLEngine on
            SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
            SSLCertificateFile /usr/local/etc/apache22/www_domain_ru.crt
            SSLCertificateKeyFile "/usr/local/etc/apache22/server.key"
            SSLCACertificateFile /usr/local/etc/apache22/www_domain_ru.ca-bundle
            <FilesMatch "\.(cgi|shtml|phtml|php)$">
                SSLOptions +StdEnvVars
            </FilesMatch>
            <Directory "/usr/local/www/apache22/cgi-bin">
                SSLOptions +StdEnvVars
            </Directory>
            BrowserMatch ".*MSIE.*" \
                     nokeepalive ssl-unclean-shutdown \
                     downgrade-1.0 force-response-1.0
        </VirtualHost>

a.b.c.d — IP-адрес виртуального хоста. Обратите внимание на директивы
SSLCertificateFile и SSLCACertificateFile — это как раз те директивы,
которые указывают на полученные и подписанные ssl-сертификаты.

3) Создаём скрипт echo в папке /usr/local/etc/apache22, который будет
отвечать Apache на запрос пароля сертификатов следующего содержания:

        #!/bin/sh
        /bin/echo agu7Lirithiunee

Меняем владельца и права доступа:

        # chown root:wheel /usr/local/etc/apache22/echo
        # chmod 700 /usr/local/etc/apache22/echo

4) Создаём обычный виртуальный хост. Для этого редактируем конфиг
httpd-vhosts.conf. Примеры виртуальных хостов я комментирую, так как
пользуюсь минимальным набором директив.

        NameVirtualHost a.b.c.d:80
        <VirtualHost a.b.c.d:80>
            DocumentRoot "/usr/local/www/apache22/data"
            ServerName www.domain.ru
        </VirtualHost>

Важное дополнение. В связи с тем, что сертификаты подписываются на конкретный домен,
то у нас будет проблема, в случае нескольких алиасов для сервера или если сервер
доступен с локальной сети под одной адресацией/алиасом, а с интернета — под другими.
Самый верный способ — сделать перенаправление. Способов сделать много, покажу тот,
который использует файл .htaccess и mod_rewrite.

1) Открываем для редактирования конфиг httpd-vhosts.conf.
2) Разрешаем опцию AllowOverride, для этого меняем содержимое виртуального хоста
на ниже следующее:

        NameVirtualHost a.b.c.d:80
        <VirtualHost a.b.c.d:80>
            DocumentRoot "/usr/local/www/apache22/data"
            ServerName www.domain.ru
            <Directory /usr/local/www/apache22/data/>
              AllowOverride All
            </Directory>
        </VirtualHost>

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



















































































Смотрите также:

Readers Comments (Один комментарий)

  1. Дмитрий:

    Для протокола SSL должен использоваться другой акцепт-фильтр: accf_data
    http://httpd.apache.org/docs/2.2/mod/core.html
    И для безопасности клиентов необходимо увеличить длительность сессий до пересогласования в пределах реального времени работы людей. Например:
    SSLSessionCacheTimeout 1200
    А также убрать все слабые протоколы:
    SSLProtocol all -SSLv2
    SSLCipherSuite HIGH:!ADH
    Это реально работает.




Да человек я, человек! =)

Exchange 2007

Проведение мониторинга Exchange 2007 с помощью диспетчера System Center Operations Manager 2007 (часть 3)

Если вы хотите прочитать предыдущие части этой серии статей, перейдите по ссылкам: Проведение мониторинга Exchange 2007 с помощью диспетчера System ... [+]

Практическое рассмотрение перехода с Exchange 2003 на Exchange 2007 (часть 1)

Введение В этой статье из нескольких частей я хочу показать вам процесс, который недавно использовал для перехода с существующей среды Exchange 2003 ... [+]

Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (часть 2)

Если вы пропустили первую часть этой серии, пожалуйста, прочтите ее по ссылке Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (Часть ... [+]

Мониторинг Exchange 2007 с помощью диспетчера System Center Operations Manager 2007 (часть 2)

Если вы пропустили предыдущую часть этой серии статей, перейдите по ссылке Мониторинг Exchange 2007 с помощью диспетчера System Center Operations ... [+]

Подробное рассмотрение подготовки Active Directory для Exchange 2007 (часть 5)

Если вы пропустили предыдущие части этой серии статей, перейдите по ссылкам: Подробное рассмотрение подготовки Active Directory для Exchange 2007 (часть 1) ... [+]

Установка и настройка Exchange 2007 из командной строки (Часть 3)

If you missed the previous parts in this article series please read: Exchange 2007 Install and Configuration from the command line (Part ... [+]

Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (часть 1)

Инструмент ExRCA Текущий выпуск инструмента предоставляется только в целях тестирования и оснащен 5 опциями: Тест подключения Outlook 2007 Autodiscover Тест подключения Outlook 2003 RPC ... [+]

Развертывание сервера Exchange 2007 Edge Transport (часть 5)

Если вы хотите прочитать предыдущие части этой серии статей, перейдите по ссылкам: Развертывание сервера Exchange 2007 Edge Transport (часть 1) Развертывание ... [+]

Установка и настройка Exchange 2007 из командной строки (часть 2)

Если вы пропустили первую статью данного цикла, пожалуйста, перейдите по ссылке: Exchange 2007 Install and Configuration from the command line (Part ... [+]

Использование интегрированных сценариев Using Exchange Server 2007 – часть 2: генерирование отчетов агента Transport AntiSpam Agent

Если вы пропустили предыдущую часть этой серии статей, перейдите по ссылке Использование интегрированных сценариев Using Exchange Server 2007 – часть ... [+]