Возрастающие требования к безопасности привели к тому, что 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 на хостинге.
Если ваш Mail Server показывает ошибки, то следует проверить, не идут ли ваши email в "спам"?
Несмотря на несоответствия в DNS-записях, google.com использует протокол https и имеет "зеленый замок".
Если проверить сертификат на ssllabs.com, то класс соединения "А", что вполне удовлетворительно.
Как мы видим, ошибки в настройках домена не мешают установить 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
Вы должны получить класс "А+".
Не забывайте обновлять сертификат каждые 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, либо на относительные ссылки вида src="//mydomain.com/image.jpg". Если все сделаете правильно, появится "зеленый замок", и соединение с вашим сайтом будет происходить по протоколу https.
Повышение безопасности соединения "клиент - сервер"
Из-за отсутствия защиты протокола http в 1994 году был разработан протокол https, который использует криптографическую систему SSL/TLS для шифрования данных и устанавливает защищенное соединение с помощью секретного одноразового ключа. SSL-сертификат используется для проверки подлинности соединения, после чего начинается обмен пакетами данных.
Мы разобрались на простом примере получения ssl-сертификата и редиректа на https, как сделать соединение более безопасным, но этого недостаточно, если вы работаете над сложным, серьезным проектом. Для максимальной защиты вашего сайта необходимо пройти многоступенчатую проверку с помощью опытных квалифицированных специалистов. Если у вас нет возможности для этого, можете воспользоваться онлайн-сервисами по проверке на уязвимость, например: pentest-tools.com/website-vulnerability-scanning/web-server-scanner. Это лучше, чем ничего, но тем не менее, на многих сайтах можно найти уйму уязвимостей даже с помощью бесплатных сервисов.