Настройка HTTPS на Apache с использованием Let’s Encrypt в Ubuntu

В данном руководстве я объясню, как корректно активировать HTTPS на Apache с помощью Let’s Encrypt в операционной системе Ubuntu. Браузеры Google Chrome и Firefox уже начали маркировать незашифрованные веб-страницы, содержащие поля для ввода паролей, как небезопасные. В конечном итоге все сайты, работающие по протоколу HTTP, будут обозначаться как ненадежные. HTTPS станет необходимым стандартом для любого веб-ресурса. Кроме того, это требование обязательно, если вы хотите использовать протокол HTTP/2 для повышения скорости работы вашего сайта.

Let’s Encrypt — это бесплатный, автоматизированный и открытый центр сертификации, о чем, вероятно, вам уже известно. В официальной документации представлены простые шаги для активации HTTPS с помощью Let’s Encrypt, но это не все возможности. Следуя этим документам, вы сможете получить оценку A в тесте SSL Labs. Однако, если воспользуетесь моими рекомендациями, ваш результат будет A+. Даже если вы уже использовали сертификат Let’s Encrypt ранее, вы можете обратиться к этому руководству для обновления и замены вашего существующего сертификата.

Перед тем как представить шаги для активации HTTPS с использованием Let’s Encrypt, хочу сначала обсудить такие аспекты, как CAA-запись, заголовки безопасности и OCSP-стаплинг. Эти элементы могут способствовать достижению оценки A+. В конце этого руководства я также расскажу о том, как взаимодействовать с сервисом CloudFlare CDN.

Примечание: Данное руководство совместимо со всеми актуальными версиями Apache и Ubuntu, включая 16.04, 18.04 и 20.04.

Настройка CAA-записи для вашего домена.

Запись авторизации центра сертификации (CAA) — это запись в DNS, которая определяет, какие центры сертификации (CA) имеют право выдавать сертификаты для конкретного домена. С сентября 2017 года все CA обязаны проверять наличие записей CAA перед выдачей сертификатов для заданного домена. Если запись CAA отсутствует, любой CA может получить возможность выдать сертификат для этого домена. Если в вашей записи CAA нет конкретного CA, то он не имеет права выдавать сертификат для вашего доменного имени.

Для того чтобы установить запись CAA, разрешающую Let’s Encrypt выдавать сертификат для вашего доменного имени, внесите следующую запись в настройки вашего DNS-сервера или в DNS-менеджер.

example.com. IN CAA 0 issue "letsencrypt. org"

Вы также можете воспользоваться iodef, чтобы удостоверяющий центр уведомлял вас по электронной почте о запросах на выдачу вредоносных сертификатов.

example.comВ CAA 0 iodef "mailto:your-email-address"

Формат указанных записей разработан для файлов зоны. Вот несколько рекомендаций для вас.

  • С помощью SSLMate CAA Record Helper вы можете создать запись CAA для вашего домена.
  • Если вы пользуетесь DNS от GoDaddy, ознакомьтесь с этой статьей, чтобы узнать, как добавить запись CAA.

Для проверки вашей записи CAA воспользуйтесь следующей командой dig.

dig example.com CAA

Учтите, что веб-браузеры не осуществляют проверку записей CAA.

Заголовки для обеспечения безопасности

Безопасные заголовки столь же значимы, как и использование HTTPS, однако лишь малая доля сайтов с активированным HTTPS уделяет внимание этим заголовкам. Полный анализ заголовков безопасности выходит за рамки данного руководства, но я хотел бы обсудить заголовки

Читайте также:  Опыт использования Red OS в государственных организациях

upgrade-insecure-requests

и HSTS, так как их можно просто активировать с помощью Let’s Encrypt для улучшения безопасности вашего веб-ресурса.

Обновление открытых запросов

Есть ситуации, когда сайт использует HTTPS, однако некоторые ресурсы, такие как CSS, изображения или JavaScripts, все еще загружаются по протоколу HTTP. В таких случаях зеленый замок в адресной строке браузера пропадает. В Google Chrome он заменяется значком информации, а в Firefox — серым замком с желтым треугольником. Чтобы обеспечить отображение зеленого замка для посетителей сайта, можно легко решить эту проблему, активировав заголовок upgrade-insecure-requests, который заставляет браузер использовать https:// для всех ресурсов, доступных по http://.

Для активации этого заголовка просто добавьте флаг —uir при запуске команды certbot. Имейте в виду, что этот заголовок применим как к ресурсам на вашем собственном домене, так и к ресурсам на сторонних доменах с поддержкой HTTPS. Если ваша веб-страница использует ресурсы с внешних серверов, которые не поддерживают HTTPS, такие ресурсы будут заблокированы веб-браузерами. Однако применение этого заголовка обеспечит, что ваши веб-страницы всегда будут отображаться с зеленым замком.

HSTS (Строгая политика транспортной безопасности HTTP)

Заголовок HSTS указывает веб-браузерам, что все взаимодействия с вашим сайтом должны происходить по протоколу HTTPS. Он защищает от атаки SSL Striping, при которой связь по HTTPS заменяется на HTTP. Для активации этого заголовка просто добавьте параметр —hsts при запуске команды certbot.

OCSP Stapling

При подключении к HTTPS-сайту веб-браузер отправляет запрос через протокол OCSP (Online Certificate Status Protocol) к центру сертификации (CA) для проверки статуса отзыва SSL-сертификата сайта. По данным телеметрии Firefox, этот процесс может замедлить загрузку страницы на 1-3 секунды.

Для повышения производительности владелец сайта может активировать OCSP stapling. При этом веб-сервер периодически получает ответ OCSP, подписанный удостоверяющим центром, и передает его веб-браузеру, что исключает необходимость браузера обращаться к OCSP-серверу.

Для активации OCSP stapling достаточно добавить флаг —staple-ocsp при запуске команды certbot.

OCSP обязательно должен быть закреплён

Если злоумышленник создаст фальшивый дублирующий сайт, отключит OCSP stapling и заблокирует доступ браузера к OCSP-серверу, то браузер будет считать, что всё в порядке, и продолжит подключение к вредоносному ресурсу. Чтобы предотвратить эту ситуацию, рекомендуется включить OCSP must staple на вашем сайте. Это позволит браузерам узнать, что ответ OCSP stapling должен быть предоставлен именно вашим сайтом в процессе HTTPS-соединения. Таким образом, при попытке подключения к поддельному сайту без OCSP stapling соединение будет прервано.

Для активации функции OCSP must staple добавьте параметр —must-staple при запуске команды certbot.

Установка клиента Let’s Encrypt (Certbot) на операционной системе Ubuntu

Пришло время приступить к практическим занятиям. Начиная с Ubuntu 16.04, клиент Let’s Encrypt (Certbot) доступен в репозитории Ubuntu, что позволяет установить его с помощью следующей команды. Плагин python3-certbot-apache служит для интеграции Certbot с Apache.

sudo apt install certbot python3-certbot-apache

Чтобы узнать номер версии, выполните следующую команду.

certbot --version

certbot 0.31.0

Чтобы установить последнюю версию, вы можете воспользоваться Certbot из Snap Store.

sudo apt install snapd sudo snap install --classic certbot

Обратите внимание: для использования версии Snap необходимо указывать полный путь к исполняемому файлу: /snap/bin/certbot.

Читайте также:  Как начать использовать Docker с нуля простое руководство для начинающих

Применение плагина Apache для активации HTTPS

Если ваш сайт не применяет CDN-сервис, стоит рассмотреть возможность установки плагина Apache для активации HTTPS на веб-сервере Apache. Этот плагин способен автоматически получить SSL/TLS-сертификат и произвести его настройку. Для этого выполните следующую команду на своем сервере Ubuntu.

  • —apache: Применить аутентификатор и инсталлятор Apache.
  • —согласие-с-условиями : Подтвердить согласие с условиями обслуживания Let’s Encrypt
  • —перенаправление: Автоматически переводить весь HTTP-трафик на HTTPS.
  • Добавьте заголовок “Content-Security-Policy: upgrade-insecure-requests” к каждому ответу HTTP.
  • Добавьте заголовок Strict-Transport-Security ко всем HTTP-ответам.
  • —staple-ocsp : Активирует OCSP Stapling.
  • —must-staple: Включает в сертификат расширение OCSP Must Staple.
  • Флаг — d должен соответствовать списку доменных имен, которые разделены запятыми. Вы можете указать до 100 доменных имен.
  • —email: Адрес электронной почты, который применяется для регистрации и восстановления связи.

Вам предложат указать, желаете ли вы получать электронные письма от EFF (Фонда электронного фронта). После того как вы выберете Y или N, ваш SSL-сертификат будет автоматически выдан и настроен, о чем вы получите уведомление ниже.

Теперь, когда вы зайдете на свой веб-сайт, произойдет автоматическое перенаправление с HTTP на HTTPS. Имейте в виду, что клиент certbot создает файл виртуального хоста SSL в /etc/apache2/sites-enabled/example.com-le-ssl.conf в процессе настройки SSL для вашего сайта.

Проверка SSL-сертификата вашего сайта

Посетите ssllabs.com, чтобы оценить свой SSL-сертификат и его настройки. Как и обещал, вы получите оценку A+. Кроме того, у вас есть возможность проверить, настроена ли запись CAA для вашего доменного имени, а также активированы ли HSTS, OCSP stapling и OCSP must staple на вашем сервере.

Установка certbot для Apache на Ubuntu 16.04.

Перенаправление с версии сайта с WWW на без WWW (или в обратном направлении)

Мы уже включили перенаправление HTTP на HTTPS, что осталось сделать — перенаправить www на non-www или наоборот. Если вы используете WordPress, то это очень просто. Просто перейдите в Панель управления WordPress > Настройки >Укажите общие настройки и выберите предпочтительную версию (с www или без www) в полях «Адрес WordPress» и «Адрес сайта».

переадресация apache с letsencrypt

Если вы выберете этот маршрут, то столкнетесь с ситуацией, известной как двойной 301 редирект. Сначала сервер Apache осуществляет перенаправление с HTTP на HTTPS, после чего WordPress перенаправляет на домен с www или без него.

Некоторые считают, что при использовании двойного 301 редиректа вы рискуете утратить ссылочный вес для SEO. Если это вызывает у вас опасения, воспользуйтесь приведенным ниже способом, чтобы все варианты домена перенаправлялись напрямую на целевой адрес.

Внесите изменения в файл вашего виртуального хоста (исключая виртуальный хост SSL).

sudo nano /etc/apache2/sites-enabled/example.com.conf

Клиент CertBot внес в файл дополнительные строки, чтобы осуществить перенаправление с HTTP на HTTPS.

RewriteEngine on RewriteCond % =example.com[ИЛИ] RewriteCond % =www. example.com RewriteRule ^ https://%% [END, NE, R=permanent]

Для того чтобы перенаправить на домен с www или без него, необходимо изменить последнюю строку. Замените % на ту версию домена, которую вы предпочитаете, как указано ниже (домен с www).

RewriteRule ^ https://www. example.com% [END, NE, R=permanent]

Если вы хотите использовать домен без www, замените его на следующий.

RewriteRule ^ https://example.com% [END, NE, R=permanent]

После этого сохраните файл и закройте его. Также потребуется внести изменения в SSL-виртуальный хост.

sudo nano /etc/apache2/sites-enabled/example.com-le-ssl.conf

Вставьте указанные строки перед завершающим тегом.для перенаправления домена без www на домен с www.

Читайте также:  Пошаговое руководство по установке Homebrew на macOS

RewriteEngine on RewriteCond % =example.comRewriteRule ^ https://www. example.com% [END, NE, R=permanent]

Чтобы перенаправить домен с www на домен без www, используйте следующие строки вместо этого.

RewriteEngine on RewriteCond % =www. example.comRewriteRule ^ https://example.com% [END, NE, R=permanent]

Сохраните файл и закройте его. Перезапустите службу Apache для применения внесённых изменений.

sudo systemctl reload apache2

Для большей ясности я прикладываю скриншот моего файла виртуального хоста Apache и файла виртуального хоста SSL, которые используются для перенаправления домена без www на версию с www.

Конфигурационный файл виртуального хоста Apache

SSL-конфигурационный файл для виртуального хоста Apache

Перед изменением файлов виртуального хоста Apache, убедитесь, что в настройках WordPress вы выбрали предпочтительный вариант домена как в поле «Адрес WordPress», так и в «Адрес сайта». Несоответствие между настройками WordPress и конфигурацией Apache может привести к бесконечным перенаправлениям на сайте.

Для отключения TLS версии 1 и 1.1

Версии TLSv1 и TLSv1.1 больше не считаются безопасными. Для их отключения необходимо внести изменения в конфигурационный файл SSL параметров Let’s Encrypt.

sudo nano /etc/letsencrypt/options-ssl-apache.conf

Определите строку, которая отвечает за отключение SSLv2 и SSLv3 по умолчанию.

SSLProtocol all - SSLv2 - SSLv3

Замените ее на следующую, чтобы отключить TLS версии 1.0 и 1.1.

SSLProtocol all - SSLv2 - SSLv3 - TLSv1 - TLSv1.1

Сохраните изменения в файле и закройте его. После этого перезапустите Apache.

sudo systemctl restart apache2

Автоматическое обновление сертификата

Для автоматического продления сертификата Let’s Encrypt необходимо внести изменения в файл crontab пользователя root.

sudo crontab - e

После этого введите следующую строку в самом конце.

@daily certbot renew --quiet && systemctl reload apache2

Флаг —quiet отключает стандартные сообщения. Чтобы получать уведомления об ошибках, добавьте следующую строку в начале файла crontab.

MAILTO=ваш-адрес-электронной-почты

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

Сеть доставки контента CloudFlare

Для начала важно понимать, что при установке сертификата Let’s Encrypt на ваш сервер и использовании CDN-сервиса CloudFlare, необходимо активировать универсальный SSL CloudFlare для вашего сайта. Это означает…

  • Связь между пользователями сайта и сервером CloudFlare обеспечивается защитой с использованием универсального SSL-сертификата от CloudFlare.
  • Связь между вашим основным сервером и сервером CloudFlare защищена сертификатом, полученным от Let’s Encrypt.

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

Во-вторых, стоит отметить, что если вы планируете добавить запись CAA с использованием универсального SSL от CloudFlare, вам потребуется создать следующую запись CAA.

example.com. IN CAA 0 issue "comodoca.com" example.com. IN CAA 0 issue "digicert.com" example.com. IN CAA 0 issue "globalsign.com

Следуйте этому сообщению, чтобы внести запись CAA для сертификата универсального SSL от CloudFlare.

Как вы планируете установить сертификат Let’s Encrypt при использовании CloudFlare? Существует два возможных варианта.

  1. Теперь, после установки сертификата Let’s Encrypt с помощью указанных ранее шагов, вы хотите активировать сервис CDN от CloudFlare.
  2. Ваш сайт работает с CDN CloudFlare, и теперь вы планируете установить сертификат Let’s Encrypt на исходном сервере.

Если вы находитесь в первом сценарии, вы можете смело включать сервис CDN CloudFlare, а также включить универсальный SSL CloudFlare в панели управления CloudFlare, перейдя в Crypto >SSL с настройкой Full (Strict) обеспечит корректную работу вашего сайта без каких-либо проблем.

Если вы применяете CDN CloudFlare и собираетесь установить Let’s Encrypt на своем основном сервере, выполните следующую команду для получения и установки сертификата TLS от Let’s Encrypt.

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