Site icon 8HOST.COM

Создание сертификата Let’s Encrypt для Nginx в Ubuntu 20.04

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

Читайте также: Основы OpenSSL: SSL-сертификаты, закрытые ключи и запросы на подпись

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

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

Требования

1: Установка Certbot

Для начала нужно установить клиент Certbot на ваш сервер.

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

sudo apt install certbot python3-certbot-nginx

Теперь Certbot готов к работе, но для того, чтобы настроить SSL для Nginx, нужно проверить некоторые конфигурации.

2: Проверка параметров Nginx

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

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

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

sudo nano /etc/nginx/sites-available/example.com

Найдите строку server_name:

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

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

sudo nginx -t

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

Если ошибок в конфигурации нет, перезапустите веб-сервер.

sudo systemctl reload nginx

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

3: Настройка брандмауэра

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

Во время установки Nginx регистрирует в ufw несколько профилей. Просмотреть текущие настройки можно с помощью команды:

sudo ufw status

Скорее всего, брандмауэр пока что поддерживает только трафик HTTP:

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 Full и удалите профиль Nginx.

sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'

Теперь параметры брандмауэра будут выглядеть так:

sudo ufw status
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 позаботится о реконфигурации веб-сервера и при необходимости перезагрузит его. Чтобы использовать этот плагин, введите:

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

Эта команда запустит certbot с плагином — nginx, а флаг –d определит имена, для которых предназначен сертификат.

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

Если проверка пройдет успешно, certbot спросит, как вы хотите настроить HTTPS:

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 выведет сообщение о том, что процесс был выполнен успешно и скажет, где хранятся ваши сертификаты:

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: Проверка автоматического обновления сертификата

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

Чтобы проверить статус таймера, введите:

sudo systemctl status certbot.timer
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

Чтобы протестировать процесс обновления сертификата, запустите сухой прогон:

sudo certbot renew --dry-run

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

Заключение

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