Apache → Настройка HTTPS в Apache
Нового здесь ничего не будет, всё это миллионы раз описано в документации и подобных записях по блогам. Так что оставлю здесь эту заметку для себя, чтобы не искать каждый раз, когда это потребуется.
В двух словах - что такое HTTPS и с чем его едят.
HTTPS - это расширение протокола HTTP, поддерживающий шифрование. Данные, передаваемые подобным образом, шифруются с использованием SSL или TLS.
В данной заметке будет создаваться самоподписанный сертификат и хотя браузеры начнут ругаться, что такой сертификат не является доверенным, но свою задачу выполнять он всё таки будет, т.е. если и не исключит возможность прослушивания при помощи тех же снифферов, например, но, по меньшей мере, сильно затруднит жизнь некоторых хацкеров. И что немаловажно - такой сертификат не будет стоить ни копейки, в отличии от сертификатов, подписанных компаниями-сертификаторами :)
В первую очередь сгенерируем приватный ключ RSA и запрос на подписание сертификата CSR.
openssl genrsa -des3 -out server.key 1024 openssl req -new -key server.key -out server.csr
После выполнения второй команды необходимо ответить на вопросы, которые будут выскакивать. Важно, чтобы в поле Common Name попало доменное имя сайта, допустим, dbadmin.example.org
Следующими действиями убираем парольную фразу из полученного ранее ключа. Можно этого и не делать, но тогда Apache будет спрашивать её при каждом перезапуске, что не всегда удобно. Да и сервер может быть перегружен без вашего участия.
cp server.key server.key.orig openssl rsa -in server.key.orig -out server.key
И последний шаг, собственно генерация сертификата dbadmin.crt, который в указанном примере истечёт через 365 дней.
openssl x509 -req -days 365 -in server.csr -signkey server.key -out dbadmin.crt
Теперь приступим к настройке Apache. Убедимся в том, что модуль mod_ssl активирован. В противном случае просто активируем его.
sudo a2enmod ssl
Настроим виртуальные хосты. Если же на сервере один хост, то можно ковыряться в одном файле - default-ssl. Но всё же будем считать, что хостов на сервере больше, чем один. Добавим отсутствующую по умолчанию (в убунте, за других не скажу) директиву NameVirtualHost для 443 порта. В Ubuntu это можно проделать в файле /etc/apache2/ports.conf
<IfModule mod_ssl.c> NameVirtualHost *:443 Listen 443 </IfModule>
Настраиваем виртуальный хост, запрещая при этом устаревший криптографический протокол SSLv2 и организуя перенаправление, если кто-то придёт на сайт по протоколу HTTP (mod_rewrite должен быть включён). Примерно таким образом:
<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>
Перезагружаем апач и радуемся. Если радость не наступила, то ищем где была допущена ошибка :)
UPD: Если нужно при этом организовать правильный редирект со старых урлов на новые, т.е. с http на соответствующие https, то немного изменим настройки виртуального хоста:
<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. В общем, надо разбираться.