Подключаем mod_ssl + SSL сертификат к apache 2.2 на FreeBSD

Установка

При установке apache 2.2 из портов, должен быть установлен флажок SSL (включен по умолчанию).

Настройка глобальных параметров SSL (httpd-ssl.conf)

Немного ясности о понятии SSL сертификата. Есть два кардинально разные типы сертификатов SSL – самоподписанные, это тот, который подписанный тем же, кто его и использует, и подписанные сторонней компанией, которая является официальным уполномоченным органом, которой доверяют многие браузеры и т.д. Самоподписанный сертификат можно генерировать самому, для этого никаких подтверждений, а также проверок проходить не надо. А вот доверенный сертификат требует уже проверок, это может быть простой проверкой собственности домена, на который подписывается сертификат SSL, но может быть и проверка личности и организации (сканы паспорта, свидетельство о регистрации Юр. Лица и т.д.), это зависит от типа желаемого сертификата SSL. Обычно, чем дороже сертификат – тем больше ему доверяют :). Для большинства eCommerce компаний сертификат SSL – это не просто мера защиты, но статус, престиж.

Редактируем файл глобальных настроек, который расположен в папке /usr/local/etc/apache22/extra

#Путь к генератору случайных чисел и размер запрашиваемой последовательности
#Задается два параметра для старта и при каждом соединении соответственно.
#В случае с FreeBSD используем устройство /dev/urandom (симлинк к /dev/random).
SSLRandomSeed startup file:/dev/random  512
SSLRandomSeed connect file:/dev/random  512
#Слушаем стандартный https порт
Listen 443
#Регистрируем типы MIME для загрузки сертификатов
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl    .crl
#Способ запроса пароля к зашифрованному приватному ключу.
#По умолчанию (builtin) запрос в консоли во время загрузки перед демонизацией Апача.
SSLPassPhraseDialog  builtin
#Тип (размер) и время жизни межпроцессного кэша сессий
#Кэш используется для ускорения параллельных загрузок изображений одним клиентом, не требуя согласования каждой сессии.
#По умолчанию используется цикличный буфер в общей памяти.
SSLSessionCache        "shmcb:/var/run/ssl_scache(512000)"
SSLSessionCacheTimeout  300
#Тип блокировок для синхронизации процессов апача
#Значение default, позволяет среде исполнения апачи выбрать лучший по ее мнению тип блокировки для данной платформы.
SSLMutex  "file:/var/run/ssl_mutex"
#Задаем настройки для SSL сертификата, если работает модуль ssl_module - эти надстройки включаются
#Внимание, это приемлемо только для одного хоста, если вы планируете несколько виртуальных хостов,
#вам необходимо отдельно для каждого хоста прописывать свой SSL сертификат, или же приобрести wildcard SSL.
<IfModule ssl_module>
    #Опрределяем протокол для SSL
    SSLProtocol all -SSLv2
    SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
    #Прописываем пути к ключам (мы их сгенерим/получим ниже, или же вы можете подключить самоподписанный SSL сертификат)
    SSLCertificateFile "/usr/local/etc/apache22/server.crt"
    SSLCertificateKeyFile "/usr/local/etc/apache22/server.key"
    #При необходимости, включаем передачу переменных окружения `SSL_*' в скрипты
    #Требует дополнительные ресурсы, отключите эту опцию, если переменные не используется
    <Directory "/usr/local/www/apache22/cgi-bin">
        SSLOptions +StdEnvVars
    </Directory>
    <FilesMatch "\.(cgi|shtml|phtml|php)$">
        SSLOptions +StdEnvVars
    </FilesMatch>
    #Раскомментировать, если требуется совместимость с IE 2-5
    #Директива снижает производительность для всех версий IE из-за отключения keep-alive
    #Для обеспечения совместимости с экспортными ограничениями
    #придется включить поддержку 56 битных ключей
    #подробности: http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html#msie
    #BrowserMatch "MSIE [2-5]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
</IfModule>

Включение mod_ssl в httpd.conf (/usr/local/etc/apache22/httpd.conf)

Убедимся, что команда загрузки mod_ssl имеется в файле и раскомментирована:

LoadModule ssl_module libexec/apache22/mod_ssl.so

Ниже найдем строки и раскоментируем:

# Secure (SSL/TLS) connections
Include etc/apache22/extra/httpd-ssl.conf

Если в файле имеются строки:

<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>

Их нужно закомментировать или удалить, они нужны только в системах, где нет устройства /dev/random:

#<IfModule ssl_module>
#SSLRandomSeed startup builtin
#SSLRandomSeed connect builtin
#</IfModule>

Если не планируем использовать никакие другие порты для apache (то есть apache не будет слушать другие порты, кроме https), то отключаем:

#Listen 443
#Listen 80

Генерация ключей

Генерирование RSA-ключа сервера Apache без шифрования

cd /usr/local/etc/apache22
openssl genrsa -out server.key 1024
#Устанавливаем права только на чтение
chmod 600 server.*

где: 1024 – стойкость шифрования, а server.key – имя файла ключа на выходе. Имя файла может быть любым. Но удобней использовать имя хоста, которому принадлежит этот ключ.

Сам ключ представляет собой текстовый файл и выглядит обычно так:

-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDHJaQYB4QwYbq1Yf177CBSPVSyl+oMPvc7QKzimldewAosMkcR
BQo/02IbIrZsHw2YHL5+EuxZr0RZLvbKCbOIWKa3FWQh00XBDEQCGKQSVAqFyi2J
Bb47nJ5nGfWfetRf33hYlRqN2CluH7uU02qV0m8IvgVduI9ce3Ddp7FblQIDAQAB
R1a/fwOWIhkKGoLAlKPxnZWgAftXMOhPkl8o4C+V2Nv/LNDW8nk6qF1/fZ9JLdld
m7vBJRooJGNzrp9z59gtAkEAl7JjjuqX3ae+Bg4/DFzJh/qyLBwwMHrlnicLxXUL
3w8f+a4t/R4vmh5Pqlep5IorWWfwhNIO2MODfzcN8XeApA==
-----END RSA PRIVATE KEY-----

Важную роль играют первая и последняя строчки файла. До и после фраз "BEGIN RSA PRIVATE KEY" и "END RSA PRIVATE KEY" должно быть ровно по пять тире. Не исправляйте никогда этот файл вручную в текстовом редакторе.

Положите полученный ключ в папку, доступную веб-серверу, например, в /usr/local/etc/apache/ssl Перейдите в эту папку и сгенерируйте CSR запрос.

Создание CSR (сertificate signing request)

cd /usr/local/etc/apache22/ssl
openssl req -new -key server.key -out server.csr

где: server.key – RSA-ключ сервера; server.csr – имя файла, в котором будет сгенерирован CSR запрос в PEM формате.

Программа начнет задавать Вам вопросы, на которые следует указывать данные о владельце будущего ключа. Естественно, вписать сюда можно что угодно (кроме пункта Common Name – оно должно точно совпадать с именем сайта, который будет использовать будущий сертификат). Но все таки стоит придерживаться правил и вписывать реальные данные.

Дополнительные ('extra') атрибуты запроса вводить не обязательно и не нужно. Просто нажать Enter. В текущей папке появится файл CSR запроса. Выглядит он обычно так:

-----BEGIN CERTIFICATE REQUEST-----
MIIB5DCCAU0CAQAwgaMxCzAJBgNVBAYTAlVBMQswCQYDVQQIEwJEUDEXMBUGA1UE
BxMORG5lcHJvcGV0cm92c2sxFDASBgNVBAoTC0RhZW1vbnkub3JnMRowGAYDVQQL
ExFBcGF5aGUgV2ViIFNlcnZlcjEbMBkG21UEAxMSc2VjdXJlLmRhZW1vbnkub3Jn
MR8wHQYJKoZIhvcNAQkBFhByb290QGRhZW1vbnkub3JnMIGfMA0GCSqGSIb3DQEB
AQUAA4GNADCBiQKBgQDKanM73zDC7YKuulG+WdsicutOQqPltQrKaG+8ifq5KhX8
QEK6cek7vMHQ195qwIXXtTUqZYRZM//Ogc+AytJ7b1csR2yiqQrh3cAcn3h1+LtX
Sy+1ty0OeUqWBRYhIgfNeuY253nPJRhicKOLTDPbmURq9SlIPXjkkirEg90Q5QID
AQABoAAwDQYJKoZIhvcNAQEFBQADgYEAGdVMaWva0eobg5Q/q8icTiE3c1WkD/B8
lp5NBfqRZ/9xzvriA2R2nmjilYfMPvP5sGi9usdul9v7iftMz/FikAuDiIwZMRFv
OIGyedJ6jJG08YKCt+YpCXXd8v2EvuyKL9NMy3C2+RAA3ZJ1YmPPYBxF07+UX0q4
SmVodjGDfpo=
-----END CERTIFICATE REQUEST-----

Имея CSR запрос, проходим по этому адресу, (либо по другим, приведенным выше), и отправляем его через форму на сайте, указывая дополнительно прочую сопутствующую информацию. Ключ пришлют Вам по e-mail. Полученный ключ (файл с расширением .crt) положите в папочку /usr/local/etc/apache/ssl и в конфигурационный файл сервера Apache для Вашего SSL хоста добавьте необходимые директивы, мы их уже добавили выше.

Настройка виртуального хоста

Виртуальный хост необходим чтобы изолировать шифруемый контент. Виртуальные хосты могу находиться как в extra/httpd-vhosts.conf, так и в Includes/*.conf.

<VirtualHost *:443>
    #Включаем SSL для этого виртуального хоста
    SSLEngine on
    ServerAdmin [email protected]
    DocumentRoot "/www/sites/адрес.нашего.сайта.ру/www"
    ServerName адрес.нашего.сайта.ру:443
    ServerAlias www.адрес.нашего.сайта.ру:443
    ErrorLog "/www/sites/адрес.нашего.сайта.ру/logs/error_hhtps_log"
    CustomLog "/www/sites/адрес.нашего.сайта.ру/logs/access_httpds_log" "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
    TransferLog "/www/sites/адрес.нашего.сайта.ру/logs/transfer_https_log"
    <Directory "/www/sites/адрес.нашего.сайта.ру/www">
        AllowOverride All
        Order allow,deny
        Allow from all
        #Запрещаем смотреть содержимое каталога, в случае отсутствия индексных файлов (index.html, index.php)
        Options -Indexes FollowSymLinks
    </Directory>
</VirtualHost>

Перезапускаем апач:

apachectl restart

Пробуем зайти на сайт 🙂

Leave a Reply