Прежде всего, нам необходимо, чтобы SSL была установлена и Apache имел установленный мод SSL. Проверить - установлен ли OpenSSL можно командой:
# dpkg --list | grep openssl
ii openssl 0.9.8k-7ubuntu8.5 Secure Socket Layer (SSL) binary and related
ii python-openssl 0.10-1 Python wrapper around the OpenSSL library
Если команда вернула пустоту - идем ставить OpenSSL - без него работать не будет.
Установка OpenSSL
# aptitude update
# aptitude install openssl
mod_ssl в ApacheНам необходимо так-же, чтобы в Apache был включен mod_ssl. Проверяем это:
# cd /etc/apache2/mods-enabled
# ls | grep ssl
ssl.conf
ssl.load
Если команда вернула пустоту - нам нужно включить этот мод. Для этого выполняем:
# ln -s /etc/apache2/mods-available/ssl.conf /etc/apache2/mods-enabled/ssl.conf
# ln -s /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled/ssl.load
Тут предполагается, что mod_ssl установлен в Apache. Так, с сервером LAMP он идет сразу, если же Apache собирался Вами из исходников и мода ssl нет, то придется его собрать отдельно.
Генерация сертификатов.Создайте директорию, в которой будут храниться сертификаты. Вы можете хранить их как в директории самого Apache, так и в любом доступном для Apache месте, например, в каталоге сайта.
# cd /etc/apache2
# mkdir sslcerts
# chown www-data:www-data sslcerts
# cd sslcerts
Теперь приступим к созданию сертификатов.
# openssl genrsa -des3 -rand /dev/random -out server.key 1024
Здесь нас запросят ввести ключевую фразу, используемую в дальнейшем для авторизации ключа сервера. Внимательно вводите эту фразу - она нам понадобится во всех следующих шагах, в том числе ее нужно будет указать в конфиге Apache!
Заметка. Если процесс зависает и ничего не делает - прерываем его Ctrl+C и вместо "/dev/random" используем "/dev/urandom".
Далее.
# 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.
1) Идем в /etc/apache2/mods-enabled и редактируем файл ssl.conf
Найдите фразу
SSLPassPhraseDialog builtin
и замените на
SSLPassPhraseDialog |/etc/apache2/sslpwd.sh
2) Открываем на редактирование файл /etc/apache2/ports.conf
В блоке "<IfModule mod_ssl.c>" перед закрытием блока, после строчки "Listen 443" добавляем строчку "NameVirtualHost *:443":
<IfModule mod_ssl.c>
# If you add NameVirtualHost *:443 here, you will also have to change
# the VirtualHost statement in /etc/apache2/sites-available/default-ssl
# to <VirtualHost *:443>
# Server Name Indication for SSL named virtual hosts is currently not
# supported by MSIE on Windows XP.
Listen 443
NameVirtualHost *:443
</IfModule>
3) Редактируем файл /etc/apache2/sites-available/default-ssl и меняем в нем "<VirtualHost _default_:443>" на "<VirtualHost *:443>":
<VirtualHost *:443>
4) Создаем новый файл /etc/apache2/sslpwd.sh со следующим содержанием:
#!/bin/sh
/bin/echo "ваша_ключевая_фраза"
где вместо "ваша_ключевая_фраза" укажите ту фразу, которую Вы использовали при создании сертификатов, тоже в кавычках (так надежнее). И дайте права запуска этому файлу:
# cd /etc/apache2
# chmod 755 sslpwd.sh
5) Теперь нам надо настроить сам сайт, чтобы он мог работать с SSL. Для этого открываем конфиг нашего сайта из /etc/apache2/sites-enabled/mysite.ru
Вместо mysite.ru - имя файла конфига Вашего сайта.
Для того, чтобы сайт был доступен по 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>
BrowserMatch ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
SSLCertificateFile /etc/apache2/sslcerts/mysite.crt
SSLCertificateKeyFile /etc/apache2/sslcerts/server.pem
</VirtualHost>
# And HTTP-version
<VirtualHost *:80>
ServerName mysite.ru
ServerAlias www.mysite.ru
DocumentRoot /www/mysite.ru
DirectoryIndex index.php
</VirtualHost>
6) Перезапускаем Apache:
# /etc/init.d/apache2 restart
Все, сайт mysite.ru будет доступен как через HTTP, так и через HTTPS. Можно HTTP версию прикрыть, конечно. Для этого достаточно убрать всю секцию:
<VirtualHost *:80>
Актуально для: Apache 2.x и Debian Lenny/Squeeze
Комментарии
Оставить комментарий
Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)
Термины: Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)