Apache → Настройка HTTPS в Apache
Нового здесь ничего не будет, всё это миллионы раз описано в документации и подобных записях по блогам. Так что оставлю здесь эту заметку для себя, чтобы не искать каждый раз, когда это потребуется.
В двух словах - что такое HTTPS и с чем его едят.
HTTPS - это расширение протокола HTTP, поддерживающий шифрование. Данные, передаваемые подобным образом, шифруются с использованием SSL или TLS.
В данной заметке будет создаваться самоподписанный сертификат и хотя браузеры начнут ругаться, что такой сертификат не является доверенным, но свою задачу выполнять он всё таки будет, т.е. если и не исключит возможность прослушивания при помощи тех же снифферов, например, но, по меньшей мере, сильно затруднит жизнь некоторых хацкеров. И что немаловажно - такой сертификат не будет стоить ни копейки, в отличии от сертификатов, подписанных компаниями-сертификаторами :)
В первую очередь сгенерируем приватный ключ RSA и запрос на подписание сертификата CSR.
1 2 | openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
|
После выполнения второй команды необходимо ответить на вопросы, которые будут выскакивать. Важно, чтобы в поле Common Name попало доменное имя сайта, допустим, dbadmin.example.org
Следующими действиями убираем парольную фразу из полученного ранее ключа. Можно этого и не делать, но тогда Apache будет спрашивать её при каждом перезапуске, что не всегда удобно. Да и сервер может быть перегружен без вашего участия.
1 2 | cp server.key server.key.orig
openssl rsa -in server.key.orig -out server.key
|
И последний шаг, собственно генерация сертификата dbadmin.crt, который в указанном примере истечёт через 365 дней.
1 | openssl x509 -req -days 365 -in server.csr -signkey server.key -out dbadmin.crt
|
Теперь приступим к настройке Apache. Убедимся в том, что модуль mod_ssl активирован. В противном случае просто активируем его.
1 | sudo a2enmod ssl
|
Настроим виртуальные хосты. Если же на сервере один хост, то можно ковыряться в одном файле - default-ssl. Но всё же будем считать, что хостов на сервере больше, чем один. Добавим отсутствующую по умолчанию (в убунте, за других не скажу) директиву NameVirtualHost для 443 порта. В Ubuntu это можно проделать в файле /etc/apache2/ports.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName dbadmin.example.org
SSLEngine on
SSLProtocol all -SSLv2
SSLCertificateFile "/etc/apache2/ssl/dbadmin.crt"
SSLCertificateKeyFile "/etc/apache2/ssl/server.key"
DocumentRoot "/srv/www/dbadmin.example.org/httpsdocs"
<Directory "/srv/www/dbadmin.example.org/httpsdocs">
AllowOverride All
</Directory>
</VirtualHost>
</IfModule>
<VirtualHost *:80>
ServerName dbadmin.example.org
Redirect permanent / https://dbadmin.example.org
</VirtualHost>
|
Настраиваем виртуальный хост, запрещая при этом устаревший криптографический протокол SSLv2 и организуя перенаправление, если кто-то придёт на сайт по протоколу HTTP (mod_rewrite должен быть включён). Примерно таким образом:
1 2 3 4 | <IfModule mod_ssl.c>
NameVirtualHost *:443
Listen 443
</IfModule>
|
Перезагружаем апач и радуемся. Если радость не наступила, то ищем где была допущена ошибка :)
UPD: Если нужно при этом организовать правильный редирект со старых урлов на новые, т.е. с http на соответствующие https, то немного изменим настройки виртуального хоста:
1 2 3 4 5 6 7 8 | <VirtualHost *:80>
ServerName example.org
ServerAlias www.example.org
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?example\.org$ [NC]
RewriteRule (.*) https://example.org%{REQUEST_URI}
</VirtualHost>
|
Комментарии
У меня Centos 6.6
Есть только httpd.conf и ssl.conf (include в httpd.conf есть)
Модуль mod_ssl.so запущен, ключ сгенерен, пути прописаны правильно,
Содержание ssl.conf
Listen 443
SSLPassPhraseDialog builtin
SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout 300
SSLMutex default
SSLRandomSeed startup file:/dev/urandom 256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
DocumentRoot "/var/www/html"
ServerName 10.152.8.50:443
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /etc/pki/tls/certs/ca.crt
SSLCertificateKeyFile /etc/pki/tls/private/ca.key
SSLOptions +StdEnvVars
SSLOptions +StdEnvVars
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
Остальное закомментировано.
Добавил во такой виртуальны хост в httpd.conf для 443:
NameVirtualHost *:443
ServerName 10.152.8.50
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/ca.crt
SSLCertificateKeyFile /etc/pki/tls/private/ca.key
AllowOverride All
DocumentRoot /var/www/html
DirectoryIndex index.php
Единственное во всех мануалах путаю с директивой Listen она есть и в конфиге апача (Listen 80) и в конфиге ssl (Listen 443) и разделом VirtualHost (для 443 он есть в ssl конфиге, все пишут добавляйте в конфиг апача основной) т.е. 2 раза. Кому верить хз. В этом мануале вообще виртуальны хост указан в разделе У меня такой раздел вообще отсутствует.
P.S. Хочу что бы по http и https открывался одна и та же страница /www/html/ без свяких сервер нэймов и т.д.
У меня эта запись, в принципе, слегка устаревшая. Процесс описан под Apache2.2 и может незначительно отличаться от такого же, но для Apache2.4. В общем, надо разбираться.