Drupal 7/8, ISPManager - установка SSL-сертификата и настройка HTTPS

Категория: Drupal, Linux
Дата публикации: 14 декабря, 2014 - 16:29
Последнее изменение: 25 сентября, 2019 - 21:33

Шаг 1. Купить для вашего домена SSL-сертификат.

У обычных хостеров/регистраторов доменов самые простые SSL-сертификаты стоят очень дорого. Выход - искать надежных реселлеров и покупать у них дешевле. Например, https://www.gogetssl.com/ - сертификат будет от Comodo. Стоит 4-5$.
Регистрируемся, оплачиваем покупку, заполняем инфу о сертификате, подтверждаем домен по почте - далее генерируем приватный ключ и запрос на получение сертификата (CSR, мне не понадобился в процессе настройки), после чего на почту приходит архив с 4 файлами. Открыть их можно простым блокнотом.

Шаг 2. Настроить домен и сервер для работы с SSL-сертификатом.

И так, у нас есть приватный ключ и четыре файла с сертификатами:
SSL сертификаты

  • Root CA Certificate - AddTrustExternalCARoot.crt
  • Intermediate CA Certificate - COMODORSAAddTrustCA.crt
  • Intermediate CA Certificate - COMODORSADomainValidationSecureServerCA.crt
  • Your PositiveSSL Certificate - youdomain_net.crt

Далее на примере панели ISPManager 4 (в 5 версии окна выглядят чуть иначе, но суть одна).

а) включить для пользователя возможность использования SSL (поставить галочку у него в настройках)
б) зайти под этим пользователем в панель и перейти в меню Сертификатов. Выбрать "создание сертификата", далее в выпадающем списке выбрать "существующий":
ispmanager добавление SSL
в) заполнить поля:
- Private key - приватный ключ, который сгенерировали на сайте https://www.gogetssl.com/ и получили по почте. Вставлять нужно 1 в 1, как в письме. Все сертификаты нужно вставлять в том виде, в каком вы их получили, вместе с комментариями. Например такими -
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
- Certificate - сертификат из файла youdomain_net.crt
- Password - пароль (если есть). У gogetssl.com его не было
- Certificate chain - вставляем сертификаты из COMODORSADomainValidationSecureServerCA.crt , COMODORSAAddTrustCA.crt и AddTrustExternalCARoot.crt . Тесты показали, что ВАЖЕН порядок добавления сертификатов в "Certificate chain". Если вставить сертификаты в другом порядке - ISPManager не даст сохранить сертификат, будет писать ошибку.
г) перейти в настройки WWW-домена, включить и выбрать добавленный SSL
д) попробовать открыть домен по https в браузере. Сайт должен открываться без каких-либо уведомлений (если выводится, что сертификат не подлинный или соединение не доверенное - значит что-то не так настроили, перепроверяте).
Есть еще множество сервисов, которые проверяют правильность установки SSL-сертификата, например -

https://www.ssllabs.com/ssltest/
https://sslcheck.globalsign.com/en_US
https://www.sslshopper.com/ssl-checker.html
https://www.digicert.com/help/
https://ssltools.websecurity.symantec.com/checker/views/certCheck.jsp
https://www.geocerts.com/ssl_checker

Большинство должно показывать, что все с сертификатами OK. Это как дополнительная проверка того, что все настроено корректно.

д) для большей безопасности нужно настроить сервер (закрыть уязвимости SSLv3). Подробнее тут.
Если ограничиться только настройками, то в nginx.conf в секцию http нужно вписать

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

После чего перезагрузить nginx.

Если у вас сервер Apache2, а не Nginx, то настройки вписываете соответственно для апача (в статье на хабре все есть).

Обновлено 09.08.2015 Новые уязвимости и новые исправления безопасности появляются очень часто, и все правильные настройки уместить в одной статье не реально. Поэтому следуйте инструкциям, которые дает https://www.ssllabs.com после проверки. Там всегда есть ссылки на инструкции по исправлению проблем.

Шаг 3. Настроить Drupal для работы с SSL.

В файле settings.php раскомментировать и заполнить значение:

$base_url =

Тут указать домен с https (актуально только для 7ки, в 8 ничего в settings.php менять не нужно)!

Вообще для друпала 7 есть модуль https://www.drupal.org/project/securepages, который должен помогать в настройке работы сайта через зашифрованное SSL-соединение. Имеется огромный мануал по настройке. Я три раза пробовал настраивать по нему - не получилось (нужно патчить ядро), модуль так и не заработал, активировать SSL не удалось.

Для себя я нашел вот такое решение - чтобы настроить сайт на работу только через https (без возможности перехода на http), нужно добавить в .htaccess вот такие строчки (работает для любой версии друпал):

# Redirect to HTTPS
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Кроме того, там же в .htaccess у меня задан редирект на "без WWW".

Некоторые сеошники требуют, чтобы не было промежуточных редиректов (на SSL и без "www"), тогда это решается следующими правилами:

# Redirecting http://www.domain.com and https://www.domain.com to https://domain.com
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [L,R=301]
# Redirecting http://domain.com to https://domain.com
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]

Большое спасибо юзеру sstedman, который выложил это решение по редиректу на https.

Еще варианты переадресаций (иногда некоторые настройки хостинга вызывают цикличный редирект, и сайт вообще не открывается):

RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

RewriteEngine On
RewriteCond %{HTTPS} =off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L]

RewriteEngine On
RewriteCond %{HTTP:PORT} !^443$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R]

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteEngine On
RewriteCond %{ENV:HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

update 09.02.2018
Альтернативное решение (добавить в начало settings.php, после открывающего тега php, example.org заменить на свой домен):

$base_url = 'https://example.org';

if (!array_key_exists('HTTPS', $_SERVER)) {
  header('HTTP/1.1 301 Moved Permanently');
  header('Location: https://example.org'. $_SERVER['REQUEST_URI']);
  exit();
}

Источник.

Важно убедиться в том, что все ресурсы (стили, шрифты, графика) загружается тоже через SSL, иначе браузеры будут показывать уведомление, что на странице есть контент, который грузится по обычному http протоколу. Для этого везде нужно:

  • использовать только относительные ссылки
  • или строго указывать https (например, это пришлось сделать для гугл шрифтов)
  • или указывать адрес вообще без указания протокола. Пример из гугла:
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Частично правила редиректов взяты у:
https://masterhost.ru/support/doc/apache/#http2https
https://www.reg.ru/support/hosting-i-servery/kak-dobavit-redirekt/redire...

Добавить комментарий