Прежде всего, нам необходимо, чтобы SSL была установлена и Apache имел установленный мод SSL. Проверить - установлен ли OpenSSL можно командой:
# pkg_info | grep openssl
openssl-1.0.0_3 SSL and crypto library
Если команда вернула пустоту - идем ставить OpenSSL - без него работать не будет.
Установка OpenSSLПереходим в /usr/ports/security/openssl и ставим.
# cd /usr/ports/security/openssl
# make config
// я здесь все оставил по-умолчанию
# make install clean
mod_ssl в ApacheНам необходимо так-же, чтобы Apache был собран с поддержкой HTTPS/SSL. Проверяем это.
# cd /usr/local/etc/apache22
# cat httpd.conf | grep mod_ssl
LoadModule ssl_module libexec/apache22/mod_ssl.so
Если команда вернула пустоту - у нас, скорее всего, Apache собран без поддержки mod_ssl. В таком случае пересобирываем Apache с поддержкой SSL:
# cd /usr/ports/www/apache22
# make deinstall
# make config
// здесь включаем поддержку mod_ssl
# make reinstall clean
Генерация сертификатов.Создайте директорию, в которой будут храниться сертификаты. Вы можете хранить их как в директории самого Apache, так и в любом доступном для Apache месте, например, в каталоге сайта.
# cd /usr/local/etc/apache22
# mkdir sslcerts
# chown www:www sslcerts
# cd sslcerts
Теперь приступим к созданию сертификатов.
# openssl genrsa -des3 -rand /dev/random -out server.key 1024
Здесь нас запросят ввести ключевую фразу, используемую в дальнейшем для авторизации ключа сервера. Внимательно вводите эту фразу - она нам понадобится во всех следующих шагах, в том числе ее нужно будет указать в конфиге Apache!
Далее.
# openssl rsa -in server.key -out server.pem
Enter pass phrase for server.key:
writing RSA key
# openssl req -new -key server.key -out mysite.csr
Здесь нас запросят ввести некоторое количество данных, помещаемых в сертификат. Вводите то, что считаете нужным, кроме строчки Common name. В этой строчке необходимо указать FQDN адрес сайта, с которого будет выдаваться сертификат (например, mysite.ru). Если это не сделать, то браузеры будут считать это ошибкой и помечать, что сертификат имеет неправильное Common name. В другой стороны - самоподписанный (как в нашем случае) сертификат они все равно не любят, т. ч. одной ошибкой больше, одной меньше - Ваше дело, особенно если Вы хотите использовать один сертификат на несколько сайтов сразу.
Вместо mysite.csr можно использовать название, похожее на название сайта - это уже файл, относящийся к сайту.
Extra-атрибуты можно не указывать совсем.
Далее.
# openssl x509 -req -days 3650 -in mysite.csr -signkey server.key -out mysite.crt
Цифра 3650 - это количество дней, которые сертификат будет действителен. Стандартное значение - 365 - нередко слишком мало из-за того, что каждый год сертификаты обновлять администраторы забывают.
Здесь следует отметить следующие моменты:
а) Файлы server.* - это файлы, на основе которых будут образованы все остальные сертификаты сайтов. Их генерировали мы один раз.
б) Для другого сайта (второго, третьего и т.д.) файлы server.key и server.pem генерировать не надо!
в) Ключ-фразу придется использовать эту же для генерации остальных сертификатов (для других сайтов).
Настройка ApacheСертификаты у нас готовы, самое время настроить Apache для поддержки SSL/HTTPS. Для этого откройте файл /usr/local/etc/apache22/httpd.conf на редактирование.
1) Необходимо убедиться, что строчка
LoadModule ssl_module libexec/apache22/mod_ssl.so
раскоментирована.
2) Теперь найдите строчку
NameVirtualHost *:80
и добавьте такую-же строчку, только с портом 443:
NameVirtualHost *:443
Тут предполагается, конечно, что Вы используете концепцию виртуальных хостов (VirtualHost).
3) Найдите строчку:
Include etc/apache22/extra/httpd-ssl.conf
и раскоментируйте ее.
4) Сохраните файл и закройте.
Создайте новый файл /usr/local/etc/apache22/sslpwd.sh со следующим содержанием:
#!/bin/sh
/bin/echo "ваша_ключевая_фраза"
где вместо "ваша_ключевая_фраза" укажите ту фразу, которую Вы использовали при создании сертификатов, тоже в кавычках (так надежнее). И дайте права запуска этому файлу:
# cd /usr/local/etc/apache22
# chmod 755 sslpwd.sh
5) В директории /usr/local/etc/apache22/extra лежит файл httpd-ssl.conf, откройте его на редактирование.
Найдите фразу
SSLPassPhraseDialog builtin
и замените на
SSLPassPhraseDialog |/usr/local/etc/apache22/sslpwd.sh
Этим мы добиваемся запуска SSLEngine без запроса ключ-фразы из консоли при старте Apache.
6) Найдите в этом же файле строчку "VirtualHost <_default_:443>" и закоментируйте все, включая ее, от нее и вплоть до строчки "</VirtualHost>", включая последнюю, иначе Ваши сайты <VirtualHost> работать не будут.
7) Сохраните файл и закройте.
8) Теперь нам надо настроить сам сайт, чтобы он мог работать с SSL. Для этого открываем конфиг нашего сайта (если конфиги сайтов лежат у Вас прямо в httpd.conf - то открываем его).
Для того, чтобы сайт был доступен по SSL нужно завести отдельный конфиг для 443-го порта. При этом на одинаковое имя сервера (ServerName) может быть как HTTP, так и HTTPS конфиги. Ниже приведен пример конфига сайта, который как раз может быть доступен как по HTTPS, так и по HTTP.
# HTTPS-version
<VirtualHost *:443>
ServerName mysite.ru
ServerAlias www.mysite.ru
DocumentRoot /www/mysite.ru
DirectoryIndex index.php
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
<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
SSLCertificateFile /usr/local/etc/apache22/sslcerts/mysite.crt
SSLCertificateKeyFile /usr/local/etc/apache22/sslcerts/server.pem
</VirtualHost>
# And HTTP-version
<VirtualHost *:80>
ServerName mysite.ru
ServerAlias www.mysite.ru
DocumentRoot /www/mysite.ru
DirectoryIndex index.php
</VirtualHost>
9) Сохраняем и закрываем.
10) Перезапускаем Apache:
# /usr/local/etc/rc.d/apache22 restart
Все, сайт mysite.ru будет доступен как через HTTP, так и через HTTPS. Можно HTTP версию прикрыть, конечно. Для этого достаточно убрать всю секцию:
<VirtualHost *:80>
Актуально для: Apache 2.x на FreeBSD любой версии
Комментарии
Оставить комментарий
Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)
Термины: Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)