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>

Комментарии

avatar
Jerronimo
avatar
Спасибо за проделанную работу - ты мне сэкономил кучу времени, очень полезная статья - добавлю себе в закладки.
ответить
avatar
morontt
avatar
Не за что. Можешь заказывать ещё статьи по волнующим разработчиков темам, есть большая вероятность, что напишу :)
ответить
avatar
Костя
avatar
Добрый день, настроил все, но не хочет он отвечать по https. По 80 порту все норм.

У меня 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/ без свяких сервер нэймов и т.д.
ответить
avatar
morontt
avatar
Здравствуйте. Посмотрю вечером, если не забуду. Пока работу работаю.

У меня эта запись, в принципе, слегка устаревшая. Процесс описан под Apache2.2 и может незначительно отличаться от такого же, но для Apache2.4. В общем, надо разбираться.
ответить
avatar
Костя
avatar
Приветствую еще раз, я дико прошу прощения,все получилось. Дело было в iptables, не открылся порт с первого раза. Поторопился. Спасибо за ответ в любом случае.
ответить
avatar
morontt
avatar
Да ничего :) У меня тут любой камент на вес золота, так что не за что просить прощения.
ответить
6 комментариев Написать что-нибудь
Адрес электронной почты нигде не отображается, необходим только для обратной связи.