HTTPS - как сделать точные настройки в Apache, nginx и robots.txt при установке бесплатного SSL-сертификата Let's Encrypt на облачный Linux

Возрастающие требования к безопасности привели к тому, что HTTPS становится протоколом соединения по умолчанию для веб-сайтов. Это породило несколько новых проблем для разработчиков и системных администраторов, таких как необходимость перенаправления домена с HTTP на HTTPS. В дополнение к этому, чтобы избежать дублирования контента в поисковых системах, необходимо выполнить перенаправление с www на non-www (или наоборот).

Для начала рассмотрим, как установить сертификат Let's Encrypt на облачный Ubuntu и c HTTP на HTTPS как сделать редирект в nginx.

Установка бесплатного сертификата Let's Encrypt на Cloud Linux

Первое, с чего следует начать, - это проверить "здоровье" вашего домена на одном из многочисленных сервисов, которые анализируют ваши DNS-записи и Mail Server на наличие ошибок.

Например, проверим google.com на бесплатном сервисе uptime.com

Ошибки в DNS-записях

Как видно на скриншоте, есть несоответствие DNS-записей. Если на вашем домене аналогичные ошибки, уточните правильные DNS на хостинге.

Ошибки в настройке Mail Server

Если ваш Mail Server показывает ошибки, то следует проверить, не идут ли ваши email в "спам"?

Несмотря на несоответствия в DNS-записях, google.com использует протокол https и имеет "зеленый замок".

Если проверить сертификат на ssllabs.com, то класс соединения "А", что вполне удовлетворительно.

Проверка сертификата на ssllabs

Как мы видим, ошибки в настройках домена не мешают установить ssl-сертификат, но свой домен все же проверьте.

Теперь давайте рассмотрим, как сделать https для сайта на примере подключения ssl-сертификата Let's Encrypt на облачном Linux (связка "Digitalocean - Serverpilot").

Вы можете выбрать другой облачный сервис или установить Linux на Virtualbox на своем компьютере бесплатно, чтобы изучить структуру папок и потренироваться выполнять команды в командной строке.

Условно будем считать, что вы уже установили через Serverpilot, например, Wordpress и подключили домен к DNS Digitalocean.

Сначала нам нужно установить Let's Encrypt и переключиться в его каталог.

$ sudo git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt

Затем мы останавливаем nginx-sp на мгновение, потому что Serverpilot связывает его с портом 80, который нам нужен для создания наших сертификатов. В противном случае установщик вызовет у нас ошибку.

$ sudo service nginx-sp stop

Когда порт 80 свободен, отправляем команду, которая разрешит шифрование для вашего домена.

$ sudo ./letsencrypt-auto certonly --standalone -d yourdomain.com -d www.yourdomain.com 

Все поддомены вы можете добавить через -d subdomain.yourdomain.com.

Если создание сертификата было успешным, вы получите ответ в командной строке о том, что ваш вновь созданный сертификат можно найти в /etc/letsencrypt/live/$ domain. Где $domain - ваше доменное имя, правильный полный путь будет показан в командной строке. Теперь вы можете снова запустить службу nginx-sp, используя команду:

$ sudo service nginx-sp start 

Скопируйте полный путь, где новые сертификаты были сохранены, он пригодится для настройки HTTPS в nginx.

Теперь переключаемся на /etc/nginx-sp/vhosts.d, где Serverpilot хранит файлы конфигурации для приложений("Apps"), созданные вами на панели управления Serverpilot.

$ sudo su
$ cd /etc/nginx-sp/vhosts.d

В панели управления Serverpilot выбираем раздел Apps и находим имя приложения, к которому мы хотим добавить сертификат SSL. В большинстве случаев - это доменное имя до первой точки.

Далее нам нужно создать файл конфигурации SSL в каталоге /etc/nginx-sp/vhosts.d. Мы делаем это, набрав:

$ sudo nano yourappname.ssl.conf

Не забудьте заменить yourappname именем приложения, которое вы только что записали.

Настройка конфигураций SSL-сертификата на сервере Nginx

Первый вопрос, который нас интересует, - это перенаправление с HTTP на HTTPS как сделать в nginx?

server {
    server_name yourdomain.com www.yourdomain.com;
    listen 80;
    return 301 https://yourdomain.com$request_uri;
}

Затем нам нужно внести конфигурацию SSL, можете скопировать и вставить конфигурации, представленные ниже или выбрать подходящие для вас в разделе "Mozilla SSL Configuration Generator" по адресу: mozilla.github.io/server-side-tls/ssl-config-generator/

server {
    server_name yourdomain.com www.yourdomain.com;
	listen 80;
	return 301 https://yourdomain.com$request_uri;
}

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name yourdomain.com www.yourdomain.com;

ssl on;
 
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

#SSL Optimization
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:20m;
ssl_session_tickets off;

# modern configuration
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 
ssl_prefer_server_ciphers on;

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:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK'; 
 
# OCSP stapling 
ssl_stapling on; 
ssl_stapling_verify on;
 
ssl_ecdh_curve secp384r1;
 
add_header Strict-Transport-Security "max-age=31536000";
#ssl_ciphers EECDH:+AES256:-3DES:RSA+AES:RSA+3DES:!NULL:!RC4;
 
# verify chain of trust of OCSP response 
ssl_trusted_certificate /etc/letsencrypt/live/yourdomain/chain.pem;

#root directory and logfiles 
 root /srv/users/serverpilot/apps/yourappname/public;
 
access_log /srv/users/serverpilot/log/yourappname/yourappname_nginx.access.log main; 
error_log /srv/users/serverpilot/log/yourappname/yourappname_nginx.error.log; 
 
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header X-Forwarded-SSL on;
 proxy_set_header X-Forwarded-Proto $scheme;
 
 include /etc/nginx-sp/vhosts.d/yourappname.d/*.nonssl_conf;
 include /etc/nginx-sp/vhosts.d/yourappname.d/*.conf;
}

Измените все "yourdomain" и "yourappname" на свои данные.

Когда закончите с изменениями, нажмите Ctrl + X, чтобы сохранить файл. Если получите сообщение об ошибке, что файл не может быть сохранен, скорее всего, вы забыли написать sudo перед входом в команду nano.

Теперь перезапустите nginx-sp, чтобы изменения вступили в силу:

$ sudo service nginx-sp restart

Если вы сделали все правильно, проверьте свой домен на ssllabs.com

Вы должны получить класс "А+".

Получение класса А плюс для SSL сертификата

Не забывайте обновлять сертификат каждые 90 дней с помощью команды:

$ cd /home/user/letsencrypt
$ sudo service nginx-sp stop
$ sudo -H ./letsencrypt-auto certonly --standalone -d yourdomain.com -d www.yourdomain.com
$ sudo service nginx-sp start

Три месяца пролетают незаметно, поэтому многих интересует для сохранения постоянного соединения через протокол HTTPS, как сделать обновление SSL-сертификата автоматически?

Просто добавьте команду для crontab в конец файла:

$ sudo crontab -e
@monthly /home/ubuntu/letsencrypt/letsencrypt-auto certonly --renew-by-default --webroot -w /srv/users/serverpilot/apps/app_name/public -d domain.tld -d www.domain.tld 

Теперь ваш домен должен загружаться как с http, так и с https протокола.

Но это еще не все, осталось разобраться, как сделать редирект с http на https, чтобы избежать дублирования контента в поисковых системах и не потерять в трафике?

Редирект Apache с www на non-www (или наоборот) и HTTP на HTTPS

Перенаправление с www на non-www и http на https:

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]

Перенаправление с non-www на www и http на https:

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]

Как сделать редирект на https в Apache?

Чтобы настроить перенаправление, выберите одну из вышеперечисленных записей либо в конфигурационный файл Apache, если у вас есть к нему доступ, либо .htaccess в корневом каталоге вашего сайта.

Где находится конфигурационный файл Apache?

Для Debian и Ubuntu характерны названия каталогов, содержащих слово "apache", для Mandriva/Fedora ищите каталоги со словом "httpd". Найти их не сложно, один из этих путей содержит искомый файл:

  • /etc/apache;
  • /etc/apache2;
  • /etc/http;
  • /etc/httpd2.

Названия основных конфигурационных файлов:

  • httpd.conf;
  • httpd2.conf;

или

  • apache.con;
  • apache2.conf.

Как это работает?

Включаем механизм преобразования Apache:

RewriteEngine On

Определяем необходимость перенаправления запроса и условия переадресации:

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]

Поскольку условия соединяются через [OR], если какое-либо из этих двух условий возвращает true, Apache выполнит правило перезаписи (перенаправление).

Первое условие определяет, есть ли HTTPS в URL-адресе, второе - наличие www в URL.

Обратите внимание, шаблон является регулярным выражением, поэтому необходимо экранировать точку в "www\." (а не "www.").

Следующая строка выделяет www от остальной части имени хоста:

RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]

RewriteRule - основа перенаправления:

RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]

С помощью этой строки мы сообщаем Apache перенаправить любой запрос на новый URL-адрес, состоит из:

  • https: //www;
  • %1: ссылка на non-www часть хоста;
  • %{REQUEST_URI}: URI запроса, без имени хоста.

Три дополнительных флага означают:

  • NE - не выполнять специальные символы.
  • R=301 - для использования статуса перенаправления HTTP 301.
  • L - прекратить обработку других правил и немедленно перенаправить.

Если вы знаете имя хоста, вы можете улучшить правило, введя URL-адрес:

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [L,NE,R=301]

Укажите также директиву "Host: https://mydomain.com" в файле robots.txt.

Установите тег: "<link rel="canonical" href="https://…"/>" в секции "<head>".

Эта простая конфигурация для перенаправления запросов www и non-www HTTPS к каноническому домену сайта поможет избавиться от дублирования контента в поисковых системах и повысит безопасность соединения.

Изменение всех внутренних ссылок с HTTP на HTTPS

Осталось сменить все внутренние ссылки с http на https.

Если это сайт Wordpress, измените в настройках админ-панели http://mydomain.com на https://mydomain.com.

Изменить все http на https,

Также необходимо найти все адреса картинок и скриптов и сменить http на https, либо на относительные ссылки вида src="//mydomain.com/image.jpg". Если все сделаете правильно, появится "зеленый замок", и соединение с вашим сайтом будет происходить по протоколу https.

Повышение безопасности соединения "клиент - сервер"

Из-за отсутствия защиты протокола http в 1994 году был разработан протокол https, который использует криптографическую систему SSL/TLS для шифрования данных и устанавливает защищенное соединение с помощью секретного одноразового ключа. SSL-сертификат используется для проверки подлинности соединения, после чего начинается обмен пакетами данных.

Мы разобрались на простом примере получения ssl-сертификата и редиректа на https, как сделать соединение более безопасным, но этого недостаточно, если вы работаете над сложным, серьезным проектом. Для максимальной защиты вашего сайта необходимо пройти многоступенчатую проверку с помощью опытных квалифицированных специалистов. Если у вас нет возможности для этого, можете воспользоваться онлайн-сервисами по проверке на уязвимость, например: pentest-tools.com/website-vulnerability-scanning/web-server-scanner. Это лучше, чем ничего, но тем не менее, на многих сайтах можно найти уйму уязвимостей даже с помощью бесплатных сервисов.

Статья закончилась. Вопросы остались?
Комментарии 0
Подписаться
Я хочу получать
Правила публикации
Редактирование комментария возможно в течении пяти минут после его создания, либо до момента появления ответа на данный комментарий.