Перевести сайт Drupal 7 на протокол HTTPS с бесплатными сертификатами LetsEncrypt на сервере Debian Nginx

Drupal: 
Уровень сложности: 

Переход на работу по протоколу HTTPS необходим для того, чтобы Chrome 56 не отображал сообщения о незащищённом соединении (новость 1, новость 2). Это основная причина, побудившая перевести http://tlito.ru на https://tlito.ru

Эта задача не из простых, в уроке вы узнаете ответы на вопросы и подробные инструкции.

Вопросы: зачем нужен SSL-сертификат? Как перейти на протокол HTTPS? Какой модуль необходим для работы Drupal 7 с HTTPS? Где скачать SSL-сертификат бесплатно? Какие есть ограничения? Как посмотреть информацию о сертификате на сайте?

Ограничения: статья написана для владельцев VPS. Сертификаты выдаются на 3 месяца. LetsEncrypt в настоящее время не работает с IDN-доменами (типа сайт.рф, русские-буквы.com и другими национальными).

Бесплатные SSL-сертификаты выдают на сайте https://letsencrypt.org/getting-started/, они дают статус "защищённого" и позволяют сайту работать по HTTPS-протоколу. Они выдаются сроком на 3 месяца, поэтому процедуру обновления сертификата нужно выполнять регулярно. Есть платные сертификаты, выдаваемые на более длительный срок.

 

Получение бесплатного SSL-сертификата от LetsEncrypt

На странице https://certbot.eff.org/#debianjessie-nginx написано, что сервис LetsEncrypt предлагает установить программу certbot для Линукс для скачки сертификата.
Чтобы установить эту программу, нужно добавить пакет backports, как написано тут https://backports.debian.org/Instructions/

узнать версию Дебиана можно командой 'lsb_release -a'.

Для установки certbot нужно добавить пакет backports:

$ nano /etc/apt/sources.list.d/backports.list

вставьте строку

обновитесь:

$ apt-get update

Установка certbot от LetsEncrypt:

apt-get install certbot -t jessie-backports

Теперь осталось скачать сертификат, прописав команду:

$ certbot certonly --webroot -w /var/www/tlito.ru/www -d tilito.ru -d www.tlito.ru

-w /var/www/tlito.ru/www - указывает адрес папки файлов сайта
-d tilito.ru -d www.tlito.ru - указывают имя домена и синонимы.

Скрипт спросит емайл, согласие с соглашением и скачает сертификат.
На сервере тлито.ру стояло ограничение на чтение папок и файлов с точкой, поэтому выдавалась ошибка доступа к файлу .well-known/... где размещался временный файл при работе certbot.
Invalid response from http://www.tlito.ru/.well-known/acme-challenge/....
После снятия ограничений в настройках хоста /etc/nginx/sites-available/tlito.ru и перезапуска nginx ошибка исчезла.

 

Сертификаты certbot положил в папку /etc/letsencrypt/live/tlito.ru

  1. $ ls /etc/letsencrypt/live/tlito.ru
  2. cert.pem chain.pem fullchain.pem privkey.pem

 

Конфигурирование сервера Nginx

Описано тут https://sheensay.ru/ssl#nastroyka-ssl-tls-v-nginx Переадресация с протокола http на https описана тут https://toster.ru/q/10318

Листинг конфигурационного файла Nginx для Drupal 7
  1. $ cat /etc/nginx/sites-available/tlito.ru
  2. server {
  3. listen 80;
  4. server_name www.tlito.ru tlito.ru;
  5. proxy_set_header Host tlito.ru;
  6. location / {
  7. rewrite ^(.*)$ https://tlito.ru$1 permanent;
  8. }
  9. }
  10.  
  11. server {
  12. listen 443 ssl;
  13. server_name www.tlito.ru tlito.ru;
  14.  
  15. set $main_host 'tlito.ru';
  16.  
  17. if ($host != $main_host) {
  18. rewrite ^(.*)$ http://$main_host$1 permanent;
  19. break;
  20. }
  21.  
  22. access_log /var/log/nginx/tlito.ru.access.log;
  23. error_log /var/log/nginx/tlito.ru.error.log;
  24.  
  25. root /var/www/$main_host/www;
  26. index index.php index.html index.htm;
  27.  
  28.  
  29.  
  30. ssl_certificate /etc/letsencrypt/live/tlito.ru/fullchain.pem; # Сертификат
  31. ssl_certificate_key /etc/letsencrypt/live/tlito.ru/privkey.pem; # Ключ
  32.  
  33. # Рекомендации по кешированию запросов
  34. keepalive_timeout 70; # 70 секунд держим соединение открытым
  35. keepalive_requests 150; # 150 запросов максимум на 1 соединение, после закрываем
  36. ssl_session_cache shared:SSL:10m; # Разделяемый между всеми процесами кеш сессий на 10 байт с названием SSL. 1 Мб вмещает около 4000 сессий
  37. ssl_session_timeout 10m; # 10 минут - максимальное время жизни сессии
  38.  
  39. ssl_prefer_server_ciphers on; # Указывает, чтобы при использовании протоколов SSLv3 и TLS серверные шифры были более приоритетны, чем клиентские
  40. ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA; # Типы шифров
  41. ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Разрешённые типы протоколов
  42.  
  43.  
  44.  
  45.  
  46.  
  47. location ~ \.php$ {
  48. include /etc/nginx/conf.d/fastcgi_params.conf;
  49.  
  50. fastcgi_param SCRIPT_FILENAME /var/www/$main_host/www$fastcgi_script_name;
  51. fastcgi_param DOCUMENT_ROOT /var/www/$main_host/www;
  52.  
  53. fastcgi_param PHP_ADMIN_VALUE upload_tmp_dir=/var/www/$main_host/tmp/upload;
  54. fastcgi_param PHP_ADMIN_VALUE session.save_path=/var/www/$main_host/tmp/sessions;
  55. }
  56.  
  57. # location ~ /\. {
  58. # deny all;
  59. # access_log off;
  60. # log_not_found off;
  61. # }
  62.  
  63.  
  64. location / {
  65. try_files $uri @cache;
  66. }
  67.  
  68. location @cache {
  69. if ($http_cookie ~ "DRUPAL_UID") { return 405; }
  70. if ($request_method !~ ^(GET|HEAD)$ ) { return 405; }
  71. error_page 405 = @drupal;
  72. gzip on;
  73. add_header Expires "Tue, 22 Sep 1974 08:00:00 GMT";
  74. add_header Cache-Control "must-revalidate, post-check=0, pre-check=0";
  75. try_files /cache/normal/$host/${uri}_${args}.html /cache/perm/$host/${uri}_.css /cache/perm/$host/${uri}_.js /cache/$host/0$uri.html /cache/$host/0${uri}/index.html @drupal;
  76. }
  77.  
  78. location @drupal {
  79. rewrite ^/(.*)$ /index.php?q=$1;
  80. }
  81.  
  82. location ~ ^/images/styles/ {
  83. try_files $uri @drupal;
  84. }
  85.  
  86. location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
  87. expires max;
  88. log_not_found off;
  89. }
  90.  
  91. }

Как можно заметить, секция для запрета доступа к файлам с точки location ~ /. {...} закомментирована. Её можно раскомментировать после удачной установки сертификата.

Рестарт Nginx:

$ service nginx restart

 

Настройка Drupal 7 для работы по HTTPS

В 7 версии функции HTTPS встроены в ядро. Достаточно добавить эти две строки в конец файла /sites/all/default/settings.php

  1. $conf['https'] = TRUE;
  2. $_SERVER['HTTPS'] = 'on';

Первая строка включает https. Но при этом CSS и картинки могут всё равно грузиться через http. Вторая строка даёт понять Drupal, что все файлы нужно грузить через HTTPS - тогда в html-кодах страниц будут фигурировать адреса CSS и картинок с протоколом https.

 

Теперь сайт работает по протоколу HTTPS.

 

Посмотреть информацию о сертификате

Если на сайте установлен режим работы HTTPS и выдан сертификат, посмотреть информацию можно в браузере.
Для Google Chrome: в адресной строке нажмите на значок слева от адреса (это должен быть замок, если включен режим HTTPS), затем - Соединение - Данные сертификата (если сертификат есть, этот пункт должен быть).
В поле "Срок действия" можно узнать, когда нужно обновить сертификат.

ssl сертификат tlito
Как узнать сведения о сертификате.

 

Ответы на вопросы

Как надо обновить SSL-сертификат? https://certbot.eff.org/docs/using.html#renewing-certificates
Какие модули необходимы для Друпал 7? Никакие, хотя они есть Secure Pages, HSTS, Secure Login.
Как включить HTTPS для Drupal 8? Неизвестно.

Ещё немного о SSL для Друпал 7,8,6 написано тут https://www.drupal.org/https-information