Возрастающие требования к безопасности привели к тому, что HTTPS становится протоколом соединения по умолчанию для веб-сайтов. Это породило несколько новых проблем для разработчиков и системных администраторов, таких как необходимость перенаправления домена с HTTP на HTTPS. В дополнение к этому, чтобы избежать дублирования контента в поисковых системах, необходимо выполнить перенаправление с www на non-www (или наоборот).
Для начала рассмотрим, как установить сертификат Let's Encrypt на облачный Ubuntu и c HTTP на HTTPS как сделать редирект в nginx.
Установка бесплатного сертификата Let's Encrypt на Cloud Linux
Вам будет интересно:Pcalua exe - что это за программа в Windows
Первое, с чего следует начать, - это проверить "здоровье" вашего домена на одном из многочисленных сервисов, которые анализируют ваши DNS-записи и Mail Server на наличие ошибок.
Например, проверим google.com на бесплатном сервисе uptime.com
Как видно на скриншоте, есть несоответствие DNS-записей. Если на вашем домене аналогичные ошибки, уточните правильные DNS на хостинге.
Если ваш Mail Server показывает ошибки, то следует проверить, не идут ли ваши email в "спам"?
Несмотря на несоответствия в DNS-записях, google.com использует протокол https и имеет "зеленый замок".
Вам будет интересно:Будьте осторожны с PHP empty при ее использовании в шорткодах Wordpress
Если проверить сертификат на 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 свободен, отправляем команду, которая разрешит шифрование для вашего домена.
Вам будет интересно:Программа Bonjour Service - что это такое и как ее удалить?
$ 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;
Вам будет интересно:Как включить Adobe Flash Player в Opera: советы и рекомендации
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.
Установите тег: "" в секции "
".Эта простая конфигурация для перенаправления запросов 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. Это лучше, чем ничего, но тем не менее, на многих сайтах можно найти уйму уязвимостей даже с помощью бесплатных сервисов.