Данный учебник иллюстрирует, как корректно настроить HTTPS на Nginx с использованием 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, вы можете воспользоваться этим руководством для обновления и замены вашего действующего сертификата.
Данный учебник состоит из трех разделов.
- Первая секция рассматривает CAA записи, заголовки безопасности и OCSP stapling. Эти аспекты позволят вам достичь оценки A+.
- Вторая часть посвящена перенаправлению домена с www на домен без www и наоборот.
- В третьем разделе я расскажу о том, как использовать сервис CloudFlare CDN.
Обратите внимание: данный учебник совместим со всеми современными версиями Nginx и Ubuntu, включая 16.04, 18.04 и 20.04.
Содержание статьи
- 1 Настройка CAA записи для вашего домена.
- 2 Темы безопасности
- 3 OCSP Stapling
- 4 OCSP обязательно нужно прикреплять.
- 5 Инсталляция клиента Let’s Encrypt (Certbot) на Ubuntu.
- 6 Применение плагина Certbot с Nginx для активации HTTPS.
- 7 Рекомендации по диагностике и исправлению проблем.
- 8 Проверка вашего SSL-сертификата.
- 9 Переключение между версиями с WWW и без него.
- 10 Как активировать протокол HTTP/2
- 11 Как деактивировать протоколы TLSv1 и TLSv1.1
- 12 Способы активации TLS 1.3.
- 13 Как активировать поддержку IPv6 в Nginx
- 14 Обновление сертификата в автоматическом режиме
- 15 Настройка переменной PATH в Crontab
- 16 CloudFlare CDN — это сеть доставки контента, которая оптимизирует и ускоряет загрузку веб-сайтов, обеспечивая защиту от DDoS-атак и улучшая общую производительность.
- 17 Следующий этап
Настройка CAA записи для вашего домена.
Авторизация центра сертификации (CAA) представляет собой DNS запись, определяющую, какие центры сертификации (ЦС) имеют право выдавать сертификаты для заданного доменного имени. С сентября 2017 года все ЦС обязаны проверять записи CAA перед тем, как выдать сертификаты для определенного домена. Если запись CAA для домена отсутствует, любой ЦС может выдать сертификат на это доменное имя. Однако если конкретный ЦС не указан в вашей записи CAA, он не вправе выдавать сертификат для вашего домена.
Для того чтобы настроить CAA запись, которая разрешит Let’s Encrypt выпускать сертификат для вашего домена, внесите указанную запись в настройки вашего DNS сервера или в панель управления DNS.
example.com. IN CAA 0 issue "letsencrypt. org"
Вы можете также задействовать iodef, чтобы Центр сертификации отправлял уведомления о запросах на получение вредоносных сертификатов на вашу электронную почту.
example.comВ CAA 0 iodef "mailto:your-email-address"
Представленный выше формат записей предназначен для зональных файлов. Вот несколько рекомендаций для вас.
- Вы можете воспользоваться помощником CAA Record от SSLMate для создания CCA записи для вашего домена.
- Если вы работаете с DNS от GoDaddy, ознакомьтесь с этой статьей, чтобы узнать, как добавить запись CAA.
Для проверки вашей CAA записи вы можете воспользоваться следующей командой dig.
dig example.com CAA
Имейте в виду, что веб-браузеры не осуществляют проверку записей CAA.
Темы безопасности
Заголовки безопасности имеют такое же значение, как и протокол HTTPS, однако лишь немногие сайты, использующие HTTPS, уделяют внимание заголовкам безопасности. Полное рассмотрение заголовков безопасности выходит за рамки данного учебника, но я расскажу о заголовках upgrade-insecure-requests и HSTS, так как их можно легко активировать с помощью Let’s Encrypt для улучшения безопасности вашего сайта.
Обновление ненадежных запросов
Есть ситуации, когда сайт использует HTTPS, но некоторые элементы, такие как CSS, изображения или JavaScript, все еще загружаются по 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, подписанный удостоверяющим центром. Когда веб-браузер обращается к сайту, Nginx сможет передать кэшированный ответ 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-nginx предназначен для интеграции Certbot с Nginx.
sudo apt install certbot python3-certbot-nginx
Чтобы узнать номер версии, выполните следующую команду.
certbot --version
certbot 0.31.0
Чтобы установить последнюю версию, вы можете воспользоваться Certbot из Snap Store.
sudo apt install snapd sudo snap install --classic certbot
Обратите внимание: для использования версии Snap необходимо указать полный путь к исполняемому файлу: /snap/bin/certbot.
Применение плагина Certbot с Nginx для активации HTTPS.
Если ваш сайт не задействует CDN, настоятельно рекомендуется установить плагин Nginx для активации HTTPS на веб-сервере Nginx, поскольку он способен автоматически получить SSL/TLS сертификат и настроить его. Выполните следующую команду на вашем сервере с Ubuntu.
- —nginx : Применить аутентификатор и инсталлятор для Nginx
- —согласие-с-условиями : Принятие условий предоставления услуг Let’s Encrypt
- —перенаправление: Установить 301 редирект.
- —uir : Включить заголовок “Content-Security-Policy: upgrade-insecure-requests” во все HTTP-ответы.
- Добавьте заголовок Strict-Transport-Security ко всем ответам сервера в формате HTTP.
- —staple-ocsp : Активирует OCSP Stapling.
- —must-staple: Включает расширение OCSP Must Staple в сертификат.
- Флаг — d используется вместе со списком доменных имен, который необходимо разделить запятыми. Можно указать до 100 доменных имен.
- Электронная почта — это адрес, который применяется для регистрации и восстановления связи.
Вы сможете указать, хотите ли получать рассылки от EFF (Electronic Frontier Foundation). После того как вы выберете Y или N, ваш SSL-сертификат будет автоматически сгенерирован и настроен, о чем вы получите уведомление ниже.

- /etc/letsencrypt/live/example.com/fullchain. pem : Это полная цепочка, содержащая корневой сертификат CA, промежуточный сертификат CA и сертификат вашего сервера.
- /etс/letsencrypt/live/example.com/privkey. pem : Закрытый ключ вашего сервера.
Теперь, когда вы зайдете на свой веб-сайт, вы заметите, что HTTP автоматически перенаправляется на HTTPS. Установлено, что плагин Nginx в данный момент не поддерживает флаг —uir. Для того чтобы вручную добавить заголовок upgrade-insecure-requests, необходимо отредактировать файл конфигурации блока сервера Nginx.
sudo nano /etc/nginx/conf.d/
example.com
.conf
Включите следующую строку в секцию SSL вашего сервера.
add_header Content-Security-Policy upgrade-insecure-requests;
Добавление DNS-резолвера в секцию сервера SSL тоже является отличным решением.
resolver 8.8.8.8;
Если резолвер не будет добавлен, в журнале ошибок Nginx может появиться следующее сообщение.
[warn] 559#559: no resolver defined to resolve ocsp. int-x3.letsencrypt. org while requesting certificate status, responder: ocsp. int-x3.letsencrypt. org
Сохраните файл и закройте его. После этого выполните перезагрузку Nginx, чтобы изменения были применены.
sudo systemctl reload nginx
Рекомендации по диагностике и исправлению проблем.
Если при использовании команды certbot вы столкнулись с перечисленными ошибками, просто повторите выполнение команды, поскольку это временная проблема с разрешением DNS.
Возникла непредвиденная проблема: Traceback (most recent call last): File "/usr/lib/python3/dist-packages/urllib3/connection. py", line 159, in _new_conn conn = connection. create_connection( File "/usr/lib/python3/dist-packages/urllib3/util/connection. py", line 61, in create_connection for res in socket. getaddrinfo(host, port, family, socket. SOCK_STREAM): File "/usr/lib/python3.8/socket. py", line 918, in getaddrinfo for res in _socket. getaddrinfo(host, port, family, type, proto, flags): socket. gaierror: [Errno -3] Временная ошибка разрешения имени
Проверка вашего SSL-сертификата.
Зайдите на сайт ssllabs.com, чтобы проверить свой SSL-сертификат и настройки. Как и обещал, вы получите оценку A+. Также у вас есть возможность выяснить, активирована ли запись CAA для вашего домена, настроен ли HSTS на сервере, а также поддерживается ли OCSP stapling и OCSP must staple.

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

Если вы решите следовать этому пути, то столкнетесь с так называемым двойным редиректом 301. Вначале сервер Nginx перенаправляет трафик с HTTP на HTTPS, а затем WordPress выполняет перенаправление на домен с www или без него. Некоторые специалисты утверждают, что такой двойной редирект может оказать отрицательное влияние на SEO вашего сайта. Если вас это беспокоит, вы можете воспользоваться приведенным ниже методом, который позволит сделать так, чтобы все версии домена напрямую переходили на конечный адрес.
Измените настройки вашего сервера Nginx.
sudo nano /etc/nginx/conf.d/example.com.conf
Клиент CertBot внес в файл новые строки для осуществления перенаправления с HTTP на HTTPS.
if ($scheme != "https") < return 301 https://$host$request_uri; ># управляется Certbot
Удалите указанные три строки и внесите изменения в настройки блока сервера, как показано на скриншоте ниже, чтобы перенаправить домен без www на версию с www.
- Первый серверный блок принимает соединения на порту 80 и включает 301 редирект, который перенаправляет запросы с HTTP на HTTPS.
- Второй блок сервера принимает запросы на порту 443. В нем настроен 301 редирект для перехода с non-www версии на www версию домена.

Если вам нужно настроить перенаправление с www на домен без www, выполните следующие шаги.
return 301 https://www. example.com$request_uri;
return 301 https://example.com$request_uri;
Измените параметр server_name в блоках SSL-сервера.
Закройте файл и сохраните изменения. Убедитесь, что настройки Nginx корректны.
sudo nginx - t
После успешного тестирования перезагрузите Nginx для применения изменений.
sudo systemctl reload nginx
Если вы работаете с WordPress, важно установить желаемую версию домена в полях «Адрес WordPress» и «Адрес сайта» до того, как будете редактировать конфигурационный файл блока сервера Nginx. В противном случае, если настройки WordPress будут несовпадать с конфигурацией Nginx, ваш сайт может попасть в цикл перенаправления.
Как активировать протокол HTTP/2
Для активации протокола HTTP/2 в Nginx откройте файл виртуального хоста и найдите соответствующую строку.
listen 443 ssl;
Добавьте в конец http2.
listen 443 ssl http2;
Сохраните изменения и закройте файл. После этого перезапустите Nginx.
sudo systemctl reload nginx
Как деактивировать протоколы TLSv1 и TLSv1.1
Протоколы TLSv1 и TLSv1.1 утратили свою безопасность. Начиная с 31 января 2020 года, SSL Labs снижает уровень до B для серверов, использующих TLS 1.0 или TLS 1.1. Для их отключения необходимо внести изменения в конфигурационный файл SSL Let’s Encrypt.
sudo nano /etc/letsencrypt/options-ssl-nginx.conf
Отследите следующую строку.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Удалите старые версии протокола TLS.
ssl_protocols TLSv1.2
Сохраните изменения в файле и закройте его. После этого перезапустите Nginx.
sudo systemctl restart nginx
Способы активации TLS 1.3.
Обратите внимание на следующую статью:
- Как просто активировать TLS 1.3 в Nginx на Ubuntu версиях 20.04, 18.04 и 16.04.
Как активировать поддержку IPv6 в Nginx
Если у вашего сервера имеется IPv6-адрес и для вашего доменного имени существует запись AAAA, рекомендуется активировать поддержку IPv6 в Nginx. Вставьте следующую строку в блок сервера HTTP.
listen [::]:80;
Внесите следующее изменение в конфигурацию сервера HTTPS.
listen [::]:443 ssl http2;
Сохраните изменения в файле и закройте его. Затем перезапустите Nginx — настройка завершена.
sudo systemctl reload nginx
Обновление сертификата в автоматическом режиме
Для автоматического обновления сертификата Let’s Encrypt достаточно внести изменения в файл crontab пользователя root.
sudo crontab - e
Добавьте следующую строку в конце.
@daily certbot renew --quiet && systemctl reload nginx
Флаг
--quiet
отключает стандартный вывод. Если необходимо получать стандартные ошибки, вставьте следующую строку в начале файла crontab.
Для того чтобы Nginx смог предоставить клиентам новый сертификат, необходимо выполнить его перезагрузку.
Настройка переменной PATH в Crontab
Порой Cron присылает мне следующее уведомление, которое можно найти в файле /var/log/letsencrypt/letsencrypt.log.
Could not choose appropriate plugin for updaters: The nginx plugin is not working; there may be problems with your existing configuration. The error was: NoInstallationError()
Эта ошибка возникает из-за того, что значение PATH в Cron по умолчанию установлено на
PATH=/usr/bin:/bin
Бинарный файл nginx располагается по пути /usr/sbin/nginx, однако Cron не может его обнаружить через стандартный PATH. Для устранения этой проблемы добавьте следующую строку в начале файла Crontab.
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
CloudFlare CDN — это сеть доставки контента, которая оптимизирует и ускоряет загрузку веб-сайтов, обеспечивая защиту от DDoS-атак и улучшая общую производительность.
Для установки сертификата Let’s Encrypt на своем сервере и использования CDN от CloudFlare, необходимо активировать универсальный SSL в настройках CloudFlare для вашего сайта. Это означает, что
- Связь между пользователями сайта и краевым сервером CloudFlare защищена с помощью сертификата Universal SSL, предоставляемого CloudFlare.
- Связь между вашим сервером и сервером CloudFlare осуществляется с помощью сертификата, предоставленного Let’s Encrypt, что обеспечивает безопасность.
Установка сертификата Let’s Encrypt на сервере и перенаправление HTTP на HTTPS без активации универсального SSL CloudFlare приведет к проблеме: веб-браузеры будут сообщать о бесконечном цикле перенаправлений. Это происходит из-за того, что CloudFlare перенаправляет HTTPS на HTTP при отключенном универсальном SSL.
Во-вторых, если вы планируете активировать запись 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
Вы хотите, чтобы текст оставался максимально близким к оригиналу, или требуется более свободная перефразировка?
Чтобы установить сертификат Let’s Encrypt с CloudFlare, есть два возможных варианта.
- После установки сертификата Let’s Encrypt по приведённым выше шагам, теперь вы хотите активировать услугу CDN от CloudFlare.
- Ваш веб-сайт использует CDN CloudFlare, и теперь вы планируете установить сертификат Let’s Encrypt на своем сервере.
Начальный вариант сценария
Если вы находитесь в первом сценарии, тогда вы можете продолжать и включить услугу CDN CloudFlare, а также активировать универсальный SSL CloudFlare в панели управления CloudFlare, перейдя в Crypto >Выберите SSL и установите режим Full (Strict), чтобы ваш сайт работал без сбоев.
Альтернативный вариант развития событий
Чтобы установить сертификат TLS Let’s Encrypt на вашем сервере при использовании CDN CloudFlare, выполните следующую команду для получения и установки сертификата.
После установки сертификата на сервере, зайдите в панель управления Cloudflare и активируйте универсальный SSL.
Следующий этап
Надеюсь, этот руководствующий материал оказался полезным для активации HTTPS на Nginx с помощью Let’s Encrypt на Ubuntu. Также вы можете настроить веб-приложение ModSecurity для повышения безопасности вашего сайта WordPress и защиты его от атак.
- Настройка ModSecurity для Nginx на системах Debian и Ubuntu.
Хотите разобраться в процессе, как сервер и веб-браузер создают безопасное HTTPS-соединение? Ознакомьтесь с материалом ниже, чтобы узнать о процедуре рукопожатия HTTPS.
- Объяснение процесса рукопожатия SSL/TLS с использованием скриншота из Wireshark.
Если вам понравился этот пост, не забудьте подписаться на нашу бесплатную рассылку, чтобы получать еще больше полезных советов и рекомендаций.

