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

Как защитить Nginx с помощью Let’s Encrypt в Ubuntu 20.04


Введение

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

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

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

Предпосылки

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

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

    Nginx установлен следующим блоком сервера для вашего домена. В этом руководстве в качестве примера будет использоваться /etc/nginx/sites-available/example.com.

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

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

    Установите Certbot и его плагин Nginx с помощью apt:

    1. sudo apt install certbot python3-certbot-nginx

    Теперь Certbot готов к использованию, но для автоматической настройки SSL для Nginx нам необходимо проверить некоторые настройки Nginx.

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

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

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

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

    1. sudo nano /etc/nginx/sites-available/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 — Разрешение HTTPS через брандмауэр

    Если у вас включен брандмауэр ufw, как рекомендовано в руководствах по предварительным требованиям, вам необходимо изменить настройки, чтобы разрешить HTTPS-трафик. К счастью, Nginx регистрирует несколько профилей в ufw при установке.

    Вы можете увидеть текущую настройку, набрав:

    1. sudo ufw status

    Вероятно, это будет выглядеть так, что означает, что к веб-серверу разрешен только HTTP-трафик:

    Output
    Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)

    Чтобы дополнительно разрешить HTTPS-трафик, разрешите полный профиль Nginx и удалите избыточный профиль Nginx HTTP:

    1. sudo ufw allow 'Nginx Full'
    2. sudo ufw delete allow 'Nginx HTTP'

    Теперь ваш статус должен выглядеть так:

    1. sudo ufw status
    Output
    Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)

    Далее давайте запустим Certbot и получим наши сертификаты.

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

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

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

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

    Если вы впервые запускаете certbot, вам будет предложено ввести адрес электронной почты и принять условия обслуживания. После этого certbot свяжется с сервером Let’s Encrypt, а затем запустит вызов, чтобы убедиться, что вы контролируете домен, для которого запрашиваете сертификат.

    В случае успеха certbot спросит, как вы хотите настроить параметры HTTPS.

    Output
    Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

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

    Output
    IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/example.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/example.com/privkey.pem Your cert will expire on 2020-08-18. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le

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

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

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

    Сертификаты Let’s Encrypt действительны только в течение девяноста дней. Это сделано для того, чтобы пользователи автоматизировали процесс обновления своих сертификатов. Установленный нами пакет certbot позаботится об этом за нас, добавив таймер systemd, который будет запускаться два раза в день и автоматически обновлять любой сертификат, срок действия которого истекает в течение тридцати дней.

    Вы можете запросить состояние таймера с помощью systemctl:

    1. sudo systemctl status certbot.timer
    Output
    ● certbot.timer - Run certbot twice daily Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled) Active: active (waiting) since Mon 2020-05-04 20:04:36 UTC; 2 weeks 1 days ago Trigger: Thu 2020-05-21 05:22:32 UTC; 9h left Triggers: ● certbot.service

    Чтобы протестировать процесс обновления, вы можете выполнить пробный запуск с помощью certbot:

    1. sudo certbot renew --dry-run

    Если вы не видите ошибок, все готово. При необходимости Certbot обновит ваши сертификаты и перезагрузит Nginx, чтобы применить изменения. Если автоматический процесс продления когда-либо завершится сбоем, Let’s Encrypt отправит сообщение на указанный вами адрес электронной почты с предупреждением о том, что срок действия вашего сертификата скоро истечет.

    Заключение

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