Поиск по сайту:

Как защитить Nginx с помощью Let’s Encrypt в Rocky Linux 9


Введение

Let’s Encrypt — это центр сертификации (ЦС), который предоставляет доступный способ получения и установки бесплатных сертификатов TLS/SSL, тем самым обеспечивая шифрование HTTPS на веб-серверах. Он упрощает процесс, предоставляя программный клиент Certbot, который пытается автоматизировать большинство (если не все) необходимых шагов. В настоящее время весь процесс получения и установки сертификата полностью автоматизирован как на Apache, так и на Nginx.

В этом руководстве вы будете использовать Certbot, чтобы получить бесплатный SSL-сертификат для Nginx в Rocky Linux 9 и настроить автоматическое обновление сертификата.

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

Предпосылки

Чтобы следовать этому руководству, вам понадобятся:

  • Один сервер Rocky Linux 9, настроенный в соответствии с этим руководством по начальной настройке сервера для Rocky Linux 9, включая пользователя без полномочий root с поддержкой sudo и брандмауэр.
  • Зарегистрированное доменное имя. В этом руководстве везде будет использоваться example.com. Вы можете приобрести доменное имя у Freenom или воспользоваться услугами регистратора доменов по вашему выбору.
  • Обе следующие записи DNS настроены для вашего сервера. Если вы используете DigitalOcean, ознакомьтесь с нашей документацией по DNS, чтобы узнать, как их добавить.
    • Запись A с example.com, указывающая на общедоступный IP-адрес вашего сервера.
    • Запись A с www.example.com, указывающая на общедоступный IP-адрес вашего сервера.

    Nginx устанавливается в соответствии с инструкциями по установке Nginx в Rocky Linux 9. Убедитесь, что у вас есть серверный блок для вашего домена. В этом руководстве в качестве примера будет использоваться /etc/nginx/sites-available/example.com.

    Шаг 1 — Установка Certbot

    Во-первых, вам необходимо установить программный пакет certbot. Войдите на свой компьютер Rocky Linux 8 как пользователь без полномочий root:

    1. ssh sammy@your_server_ip

    Пакет certbot недоступен через диспетчер пакетов по умолчанию. Вам нужно будет включить репозиторий EPEL для установки Certbot.

    Чтобы добавить репозиторий Rocky Linux 9 EPEL, выполните следующую команду:

    1. sudo dnf install epel-release

    Когда вас попросят подтвердить установку, введите y.

    Теперь, когда у вас есть доступ к дополнительному репозиторию, установите все необходимые пакеты:

    1. sudo dnf install certbot python3-certbot-nginx

    Это установит сам Certbot и плагин Nginx для Certbot, необходимый для запуска программы.

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

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

    Шаг 2 — Подтверждение конфигурации Nginx

    Certbot должен иметь возможность найти правильный блок server в вашей конфигурации Nginx, чтобы он мог автоматически настроить SSL. В частности, он делает это, ища директиву server_name, которая соответствует домену, для которого вы запрашиваете сертификат.

    Если вы выполнили шаг настройки блока сервера в руководстве по установке Nginx, у вас должен быть блок сервера для вашего домена по адресу /etc/nginx/conf.d/example.com с директивой server_name, уже заданной соответствующим образом.

    Для проверки откройте файл конфигурации вашего домена с помощью nano или вашего любимого текстового редактора:

    1. sudo nano /etc/nginx/conf.d/example.com

    Найдите существующую строку server_name. Это должно выглядеть так:

    ...
    server_name example.com www.example.com;
    ...
    

    Если это так, выйдите из редактора и перейдите к следующему шагу.

    Если это не так, обновите его, чтобы он соответствовал. Затем сохраните файл, выйдите из редактора и проверьте синтаксис изменений конфигурации:

    1. sudo nginx -t

    Если вы получили сообщение об ошибке, повторно откройте файл блока сервера и проверьте наличие опечаток или отсутствующих символов. Как только синтаксис вашего файла конфигурации будет правильным, перезагрузите Nginx, чтобы загрузить новую конфигурацию:

    1. sudo systemctl reload nginx

    Теперь Certbot может найти правильный блок server и автоматически обновить его.

    Затем давайте обновим брандмауэр, чтобы разрешить HTTPS-трафик.

    Шаг 3 — Обновление правил брандмауэра

    Поскольку ваши предварительные настройки включают firewalld, вам нужно будет настроить параметры брандмауэра, чтобы разрешить внешние подключения на вашем веб-сервере Nginx.

    Чтобы проверить, какие службы уже включены, выполните команду:

    1. sudo firewall-cmd --permanent --list-all

    Вы получите такой вывод:

    Output
    public target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client http ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:

    Если вы не видите http в списке служб, включите его, выполнив:

    1. sudo firewall-cmd --permanent --add-service=http

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

    1. sudo firewall-cmd --permanent --add-service=https

    Чтобы применить изменения, вам необходимо перезагрузить службу брандмауэра:

    1. sudo firewall-cmd --reload

    Теперь, когда вы открыли свой сервер для https-трафика, вы готовы запустить Certbot и получить свои сертификаты.

    Шаг 4 — Получение SSL-сертификата

    Certbot предоставляет различные способы получения SSL-сертификатов с помощью подключаемых модулей. Плагин Nginx позаботится о перенастройке Nginx и перезагрузке конфигурации при необходимости. Чтобы использовать этот плагин, введите следующее:

    1. sudo certbot --nginx -d example.com -d www.example.com

    Это запустит certbot с подключаемым модулем --nginx, используя -d, чтобы указать доменные имена, для которых вам нужен действительный сертификат.

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

    Output
    Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem This certificate expires on 2022-12-15. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. Deploying certificate Successfully deployed certificate for your_domain to /etc/nginx/conf.d/your_domain.conf Successfully deployed certificate for www.your_domain to /etc/nginx/conf.d/your_domain.conf Congratulations! You have successfully enabled HTTPS on https://your_domain and https://www.your_domain

    Ваши сертификаты загружены, установлены и загружены, и теперь ваша конфигурация Nginx будет автоматически перенаправлять все веб-запросы на https://. Попробуйте перезагрузить свой веб-сайт и обратите внимание на индикатор безопасности вашего браузера. Это должно указывать на то, что сайт должным образом защищен, обычно с помощью значка замка. Если вы протестируете свой сервер с помощью SSL Labs Server Test, он получит оценку A.

    Давайте закончим тестированием процесса обновления.

    Шаг 5 — Проверка автоматического продления Certbot

    Сертификаты Let’s Encrypt действительны в течение 90 дней, но рекомендуется обновлять сертификаты каждые 60 дней, чтобы учесть погрешность. В клиенте Certbot Let’s Encrypt есть команда renew, которая автоматически проверяет установленные сертификаты и пытается обновить их, если до истечения срока их действия осталось менее 30 дней.

    Вы можете протестировать автоматическое продление своих сертификатов, выполнив эту команду:

    1. sudo certbot renew --dry-run

    Вывод будет примерно таким:

    Output
    Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/your_domain.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator nginx, Installer nginx Renewing an existing certificate Performing the following challenges: http-01 challenge for monitoring.pp.ua Waiting for verification... Cleaning up challenges - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - new certificate deployed with reload of nginx server; fullchain is /etc/letsencrypt/live/your_domain/fullchain.pem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates below have not been saved.) Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/your_domain/fullchain.pem (success) ...

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

    Практический способ гарантировать, что ваши сертификаты не устареют, — это создать задание cron, которое будет периодически выполнять для вас команду автоматического обновления. Поскольку обновление сначала проверяет дату истечения срока действия и выполняет обновление только в том случае, если до истечения срока действия сертификата осталось менее 30 дней, безопасно создать задание cron, которое запускается каждую неделю или даже каждый день.

    Отредактируйте crontab, чтобы создать новое задание, которое будет запускать обновление два раза в день. Чтобы отредактировать crontab для пользователя root, запустите:

    1. sudo crontab -e

    Ваш текстовый редактор откроет crontab по умолчанию, который на данный момент является пустым текстовым файлом. Войдите в режим вставки, нажав i, и добавьте следующую строку:

    0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew --quiet
    

    Когда вы закончите, нажмите ESC, чтобы выйти из режима вставки, затем :wq и ENTER, чтобы сохранить и выйти из файла. Чтобы узнать больше о текстовом редакторе Vi и его преемнике Vim, ознакомьтесь с нашим руководством по установке и использованию текстового редактора Vim на облачном сервере.

    Это создаст новое задание cron, которое будет выполняться в полдень и в полночь каждый день. python -c import random; время импорта; time.sleep(random.random() * 3600) выберет случайную минуту в течение часа для ваших задач обновления.

    Команда renew для Certbot проверит все сертификаты, установленные в системе, и обновит те, срок действия которых истекает менее чем за тридцать дней. --quiet указывает Certbot не выводить информацию и не ждать ввода данных пользователем.

    Более подробную информацию о продлении можно найти в документации Certbot.

    Заключение

    В этом руководстве вы установили клиент Let’s Encrypt Certbot, загрузили SSL-сертификаты для своего домена и настроили автоматическое обновление сертификатов. Если у вас есть какие-либо вопросы об использовании Certbot, вы можете проверить официальную документацию Certbot.

    Вы также можете время от времени проверять официальный блог Let’s Encrypt на наличие важных обновлений.