Как защитить 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:- ssh sammy@your_server_ip
Пакет
certbot
недоступен через диспетчер пакетов по умолчанию. Вам нужно будет включить репозиторий EPEL для установки Certbot.Чтобы добавить репозиторий Rocky Linux 9 EPEL, выполните следующую команду:
- sudo dnf install epel-release
Когда вас попросят подтвердить установку, введите
y
.Теперь, когда у вас есть доступ к дополнительному репозиторию, установите все необходимые пакеты:
- 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
или вашего любимого текстового редактора:- sudo nano /etc/nginx/conf.d/example.com
Найдите существующую строку
server_name
. Это должно выглядеть так:... server_name example.com www.example.com; ...
Если это так, выйдите из редактора и перейдите к следующему шагу.
Если это не так, обновите его, чтобы он соответствовал. Затем сохраните файл, выйдите из редактора и проверьте синтаксис изменений конфигурации:
- sudo nginx -t
Если вы получили сообщение об ошибке, повторно откройте файл блока сервера и проверьте наличие опечаток или отсутствующих символов. Как только синтаксис вашего файла конфигурации будет правильным, перезагрузите Nginx, чтобы загрузить новую конфигурацию:
- sudo systemctl reload nginx
Теперь Certbot может найти правильный блок
server
и автоматически обновить его.Затем давайте обновим брандмауэр, чтобы разрешить HTTPS-трафик.
Шаг 3 — Обновление правил брандмауэра
Поскольку ваши предварительные настройки включают
firewalld
, вам нужно будет настроить параметры брандмауэра, чтобы разрешить внешние подключения на вашем веб-сервере Nginx.Чтобы проверить, какие службы уже включены, выполните команду:
- sudo firewall-cmd --permanent --list-all
Вы получите такой вывод:
Outputpublic 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
в списке служб, включите его, выполнив:- sudo firewall-cmd --permanent --add-service=http
Чтобы разрешить трафик
https
, выполните следующую команду:- sudo firewall-cmd --permanent --add-service=https
Чтобы применить изменения, вам необходимо перезагрузить службу брандмауэра:
- sudo firewall-cmd --reload
Теперь, когда вы открыли свой сервер для https-трафика, вы готовы запустить Certbot и получить свои сертификаты.
Шаг 4 — Получение SSL-сертификата
Certbot предоставляет различные способы получения SSL-сертификатов с помощью подключаемых модулей. Плагин Nginx позаботится о перенастройке Nginx и перезагрузке конфигурации при необходимости. Чтобы использовать этот плагин, введите следующее:
- sudo certbot --nginx -d example.com -d www.example.com
Это запустит
certbot
с подключаемым модулем--nginx
, используя-d
, чтобы указать доменные имена, для которых вам нужен действительный сертификат.При запуске команды вам будет предложено ввести адрес электронной почты и согласиться с условиями обслуживания. После этого вы должны увидеть сообщение о том, что процесс прошел успешно и где хранятся ваши сертификаты:
OutputSuccessfully 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 дней.Вы можете протестировать автоматическое продление своих сертификатов, выполнив эту команду:
- sudo certbot renew --dry-run
Вывод будет примерно таким:
OutputSaving 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, запустите:
- 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 на наличие важных обновлений.
- Запись A с