Вся жизнедеятельность человека через призму ступней

Настройка https на apache для нескольких сайтов на одном ip-адресе

Пока вы спали и отдыхали, я качал мозг — прошел сложный пусть по настройке сервера на apache.

Как известно, гугл начинает учитывать защищенный протокол (https), как хороший фактор ранжирования. Иными словами, если у вас есть сертификат защищенного соединения, то ваш сайт будет показываться в поиске выше.

Получение сертификата

Сертификат я бесплатно получил на startssl.com. Это достаточно просто. Идете на сайт, регистрируетесь. Подтверждаете домен, скачиваете программу для генерации ключей (под Windows), генерируете секретный ключ (я выбрал 4096 бит и sha512) и загружаете обратно запрос на сертификат. Через минуту вам дают скачать сертификат.

В итоге у вас есть файл секретного ключа site.key и файл сертификата site.crt

Настройка сервера apache

У меня была следующая ситуация. Под апачем крутилось несколько сайтов, а сертификат я получил только для одного из них. Поэтому, когда я настроил virtualhost на прием запросов на порт 443 для своего сайта, то на запрос с https начали отзываться все сайты этого сервера, но показывается только сайт с сертификатом.

Проблема связана с тем, что SSL работает не с сайтом, а ip-адресом. Соединение устанавливается с сервером по ip-адресу. Внутри соединения отдаются сайты — как бог на душу положит. Изначально стандарт защищенного соединения создавался из расчета, что на защищенный сайт будет отдельный выделенный ip-адрес.

Для решения этой проблемы я настроил Апач следующим образом. Во-первых, в файле конфигурации включаем прослушивание помимо порта 80 еще и порта 443:

Listen 80 
Listen 443

Для вашего сайта, для которого вы получили ключ и сертификат, в файле конфигурации apache вы прописываете:

<VirtualHost *:80>
ServerName secure-site.by
ServerAlias  www.secure-site.by
ServerAdmin admin@localhost
…
</VirtualHost>

<VirtualHost *:443>
UseCanonicalName On
ServerName secure-site.by
ServerAlias  www.secure-site.by
ServerAdmin admin@localhost
SSLEngine on
SSLCertificateFile /etc/configs/apache/secure-site.crt
SSLCertificateKeyFile /etc/configs/apache/secure-site.key
…
</VirtualHost>

Эти настройки позволяют показывать наш сайт по защищенному соединению.

Далее всех остальных сайтов на хостинге (которые у вас без сертификата) обязательно прописываем блоки virtualhost следующего вида:

<VirtualHost *:80>
ServerName site.by
ServerAlias  www.site.by
ServerAdmin admin@localhost
…
</VirtualHost>

<VirtualHost *:443>
UseCanonicalName On
ServerName site.by
ServerAlias  www.site.by
ServerAdmin admin@localhost
RewriteCond %{HTTP_HOST} ^site.by
RewriteRule ^/(.*)$ http://site.by/$1 [L,R=301]
SSLEngine on
SSLCertificateFile /etc/configs/apache/secure-site.crt
SSLCertificateKeyFile /etc/configs/apache/secure-site.key
…
</VirtualHost>

Это позволяет Апачу отдавать правильный сайт как для соединения по http, так и по https. Во втором случае апач принимает соединение на сайт (без поддержки https) и переадресовывает на протокол http.

После изменения конфигурационного файла апача его необходимо перезапускать — service apache2 restart

Чтобы вкурить это и настроить потребовалась 6 часов. Вполне возможно, что есть косяки с настройкой, но пока работает 🤪

Отправить
Поделиться
Запинить
1 комментарий
OLEX 2017

Доброй ночи.
А если на локалхосте должно быть несколько сайтов с https ?
У меня при наборе любого адреса из виртуалхостов на 443 порту, открывается тот, который первым прописан в конфе (((

Мистер Фит 2017

Скорее всего неправильно указана переадресация. Может у вас для каждого хоста (сайта) в быть секции указана случайно переадресация на первый сайт (выделил жирным)?

<virtualhost *:443>
ServerName xxxxxx.by
ServerAlias  xxxxxx.by
DocumentRoot "/var/xxxxxx/public_html/xxxxxx_by"
UseCanonicalName On
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/xxxxxx/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/xxxxxx/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/xxxxxx/chain.pem
**Redirect permanent / https://yyyyyy.by/**