logo Записная книжка ежа

Переводим сайт на HTTPS за несколько минут

HTTPS (HyperText Transfer Protocol Secure) — расширение протокола HTTP для поддержки шифрования в целях повышения безопасности. Основная задача HTTPS - обеспечение безопасности обмена информацией между устройством пользователя и сайтом.

Зачем на него переходить? Для сайтов это повышение доверия со стороны пользователей, один из факторов, учитываемых в ранжировании сайта поисковыми системами. С какого-то момента Google обещает помечать сайты, работающие на HTTP в браузере Chrome как небезопасные.

Теоретическая часть

По сути HTTPS - это расширение протокола HTTP, в котором реализована поддержка шифрования, обеспечивающего криптографическую защиту передаваемых данных. Таким образом обеспечивается защита от снифферских атак (прослушивание данных) и атак man-in-the-middle (атака посредника - подмена информации во время передачи между клиентом и сервером, осуществленная таким образом, что ни один из них не узнает об этом).

По умолчанию https использует порт 443, HTTP - порт 80. Для того, чтобы сервер мог обрабатывать https-соединения, администратор должен получить и установить сертификат открытого ключа для этого сервера.

Сертификаты бывают трех типов:

  • Domain Validation - подтверждают только доменное имя
  • Organisation Validation - подтверждают доменное имя и организацию
  • Extended Validation - сертификаты с расширенной безопасностью

Принцип соединения при переходе клиента на защищенный сертификатом сайт следующий:

  1. Браузер клиента отправляет запрос к сайту
  2. Сайт в ответ посылает копию сертификата
  3. Браузер проверяет, что сертификат подлинный, отправляя запрос центру сертификации, выдавшему его
  4. Если сертификат подлинные - браузер договаривается с сайтом о секретном ключе, шифрующем данные.

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

Большинство центров сертификации оказывают платные услуги, но есть варианты. Существует проект Let's Encrypt, созданный для того, чтобы большая часть сайтов перешла на HTTPS. Сервис спонсируют крупные организации (Mozilla Foundation, Cisco Systems и др.), для конечных пользователей получение сертификата реализовано бесплатно и максимально просто. Центр сертификации Let's Encrypt выдаёт сертификаты типа «Domain Validation» со сроком действия в 90 дней.

Попробуем использовать это на практике.

Практическая часть

Идем на сайт certbot - клиента для Let's Encrypt.

Там нам нужно выбрать используемое ПО (nginx, haproxy, plesk, apache) и операционную систему (множество вариантов UNIX-систем). В моем случае выбираю nginx и CentOS/RHEL 7.

Выполняем предлагаемые команды:

yum -y install yum-utils
yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
sudo yum install certbot-nginx

Дожидаемся окончания установки и выбираем один из вариантов. Если мы хотим, чтобы certbot сам конфигурировал nginx, выполняем команду:

sudo certbot --nginx

Если хотим конфигурировать вручную - добавляем опцию certonly.

sudo certbot --nginx certonly

Выбираю первый вариант, пусть конфигурирует бот. Вводим запрашиваемую информацию, в том числе выбираем перенаправлять ли весь HTTP-трафик на HTTPS.

Бот пытается получить сертификат для домена и....ошибка:

Obtaining a new certificate
Performing the following challenges:
tls-sni-01 challenge for ezhvsalate.ru
Waiting for verification...
Cleaning up challenges
Failed authorization procedure. ezhvsalate.ru (tls-sni-01): urn:acme:error:connection :: The server could not connect to the client to verify the domain :: Error getting validation data

IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: ezhvsalate.ru
   Type:   connection
   Detail: Error getting validation data

Ругаемся про себя и идем открывать 443 порт на фаерволле.

firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --reload

Пробуем еще раз - ошибка ушла. Следующая задача - настроить автоматическое обновление сертификатов.

Сначала запускаем тестовую команду:

sudo certbot renew --dry-run

Вроде как все хорошо:

Processing /etc/letsencrypt/renewal/ezhvsalate.ru.conf
-------------------------------------------------------------------------------
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator nginx, Installer nginx
Starting new HTTPS connection (1): acme-staging.api.letsencrypt.org
Renewing an existing certificate
Performing the following challenges:
tls-sni-01 challenge for ezhvsalate.ru
Waiting for verification...
Cleaning up challenges

Добавляем задачу в cron.

sudo vi /etc/crontab

Добавляем в конец файла строки (на сайте certbot рекомендовано обновление дважды в сутки):

0 4  *  *  *  * user certbot renew --quiet
0 16 *  *  *  * user certbot renew --quiet

Перезапускаем сервис cron:

sudo systemctl restart crond.service

В общем-то и все: идем на сайт и видим приятные изменения в адресной строке: