Настройка 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 часов. Вполне возможно, что есть косяки с настройкой, но пока работает 🤪
Доброй ночи.
А если на локалхосте должно быть несколько сайтов с https ?
У меня при наборе любого адреса из виртуалхостов на 443 порту, открывается тот, который первым прописан в конфе (((
Скорее всего неправильно указана переадресация. Может у вас для каждого хоста (сайта) в быть секции указана случайно переадресация на первый сайт (выделил жирным)?