Прикладной протокол передачи данных HTTPS, в отличие от HTTP, поддерживает шифрование данных. HTTPS – это HTTP + криптографический протокол TLS, реже более старый SSL. В случае HTTPS данные идут через порт 443 транспортного протокола TCP, а не порт 80.
Чтобы веб-сервер мог отправлять и получать данные по HTTPS на нем должен быть установлен сертификат с открытым ключом. Сертификат устанавливается для конкретного сервера.
Когда клиент устанавливает соединение с сервером, он получает копию открытого ключа. Запросы клиента расшифровываются с помощью закрытого ключа.
Let's Encrypt – это центр сертификации, выдающий бесплатные криптографические сертификаты.
При выдаче к запросившему сертификат веб-серверу, производится ряд запросов для подтверждения факта владения доменом. При этом происходит опрос записей DNS домена из множества географических мест.
Таким образом, сертификат можно установить только тогда, когда доменное имя уже привязано к IP или серверным именам (NS) вашего VPS.
Запросить, установить, настроить и перевыпустить сертификат Let's Encrypt можно с помощью программы-клиента certbot. Сертификат получают для веб-сервера – Apache или Nginx.
Certbot не установлен в Ubuntu по умолчанию. Кроме того, из-за активной разработки, версия в официальном репозитории скорее всего будет устаревшей. Поэтому сначала следует добавить в систему репозиторий, предоставляемый разработчиками certbot. После этого установить certbot для Apache:
sudo add-apt-repository ppa:certbot/certbot sudo apt install python-certbot-apache
Certbot написан на Python, поэтому установочный пакет имеет такое имя.
Команда
sudo certbot --apache -d example.com -d www.example.com
запускает certbot с плагином --apache, ключи -d определяют имена доменов, для которых выпускается сертификат. Кроме этого, плагин --apache берёт на себя настройку Apache и перезагрузку конфигурации.
При установке сертификата certbot проверяет, действительно ли домен делегируется на данный сервер. Далее надо выбрать, перенаправлять ли http-трафик на https или не перенаправлять, а настроить потом перенаправление самостоятельно.
Если сайт размещается на движке (Drupal, WordPress), то сертификат бывает надежней ставить после развертывания сайта. При установке сертификата можно выбрать первый вариант, без редиректа http на https. Позже настроить редирект в файле .htaccess корневого каталога сайта.
В случае выбора пункта 2, в /etc/apache2/sites-available/ в конфигурационном файле для HTTP (порт 80) прописывается редирект на HTTPS.
Если удалить его отсюда, то сайт должен стать доступным как по протоколу HTTPS, так и HTTP.
В случае успешного завершения процедуры будет выдано сообщение о местонахождении сертификата и ключа в файловой системе.
Сертификат Let's Encrypt надо обновлять каждые 90 дней. Программа certbot автоматизирует этот процесс, добавляя файл со скриптом обновления в /etc/cron.d/. Скрипт запускается раз в день и обновляет сертификаты, которые заканчиваются в ближайшие 30 дней.
Тест процесса обновления выполняется командой
sudo certbot renew --dry-run
Без опции --dry-run выполняется настоящее обновление сертификата.
При переносе сайта на новый сервер, выполняется команда выпуска, а не обновления сертификата.
Пример перенаправления на HTTPS в файле .htaccess корневого каталога сайта:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Отметим, если сайт раньше был доступен по протоколу HTTPS, при попытке открыть его на HTTP браузер будет перебрасывать на HTTPS из-за кэша. Поэтому при переносе сайта на новый хостинг тестирование работоспособности сайта на протоколе HTTP приходится выполнять в режиме инкогнито браузера.