Certbot, бесплатный SSL сертификат

В этой статье я хочу рассказать вам о Certbot.

Certbot это бесплатный open source инструмент, предназначенный для автоматизации выдачи и использования SSL сертификатов от компании Let’s Encrypt прямо из консоли сервера. Он создан некоммерческой калифорнийской организацией Electronic Frontier Foundation, которая «защищает цифровую независимость, свободу слова и инновации» (цитата). Именно благодаря этому сервису и сертификату от Let’s Encrypt можно начать использовать HTTPS протокол на своём сайте, при этом сам сертификат будет бесплатным.

Инструмент позволяет не только получить и установить сертификат SSL, но так же и обеспечить его автоматическое обновление по планировщику задач CRON.

На официальном сайте Certbot содержится большой список ОС, поддерживаемых этим инструментом автоматической установки сертификатов. Тем не менее, Certbot может использоваться и для обычной генерации сертификата SSL, с последующей установкой своими силами.

Я расскажу о наиболее, на мой взгляд, популярных наборах разработчиков, это: Ubuntu + NGINX / Apache. Рассмотрим последовательность для обоих вариантов сразу. Для доступа на сервер нужно иметь доступ по SSH протоколу.

Установка репозитория PPA

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update

На момент написания статьи, последний доступный релиз Ubuntu поддерживаемый инстрементом был Ubuntu 18.04 LTS. Тем не менее это не помешало установить Certbot на машину с Ubuntu 19.04.

Установка Certbot

Версия для сервера NGINX:

sudo apt-get install certbot python-certbot-nginx

Версия для Apache:

sudo apt-get install certbot python-certbot-apache

Как видно из прмеров, отличается только названия пакетов. Далее аналогия будет такой же.

Установка сертификата

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

Запускаем установку:

sudo certbot --nginx

или

sudo certbot --apache

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

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): someone@example.com

-------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must agree in order to register with the ACME server at https://acme-v02.api.letsencrypt.org/directory
-------------------------------------
(A)gree/(C)ancel: A

-------------------------------------
Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom.
-------------------------------------
(Y)es/(N)o: N

Далее будет предложен нумерованный список найденных доступных для конфигурации доменов. Просто выбираем номер нужного домена и нажимаем Enter.

При выборе домена может возникнуть дилемма: выбрать домен с www, если таковой имеется, или без. Тут стоит выбрать тот домен, который является основным. Считается, что домен должен быть либо с www, либо без, иметь два одновременно доступных не корректно с точки зрения SEO и дублирования контента. Именно поэтому основной домен обычно имеет редирект со второстепенного, например с www на домен без www.

После выбора сайта будет предложено установить постоянный редирект на домен с поддержкой SSL, вот пример диалога:

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): 2
Redirecting all traffic on port 80 to ssl in /etc/nginx/conf.d/example.com.conf

Опция полезная, поэтому выбираем её. После этого все переходы по ссылкам на сайт будут перенаправлены на адрес https://…

Вот и всё! После этих действий для выбранного домена будет достуен протокол HTTPS с валидным SSL сертификатом.


Если у сайта есть поддомен www, то в этом случае я рекомендую установить сертификат для него тоже, т.к. при попытке доступа по протоколу HTTPS с указанием поддомена www, например https://www.example.com, произойдёт ошибка на уровне «рукопожатия» (SSL handshake level). В этом случае браузер сообщит о невалидности сертификата ошибкой SSL_ERROR_BAD_CERT_DOMAIN.

Чтобы этого не произошло просто сгенерируем сертификат для поддомена www и выбираем нужный домен:

sudo certbot certonly --nginx


Просмотр списка сертификатов доступен по команде:

certbot certificates

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

certbot delete

В процессе выполнения команды будет предложено выбрать домен для которого следует удалить сертификат.


Если автоматизированная установка по какой-то причине не подходит, то можно просто сгенерировать сертификат командой:

sudo certbot certonly --nginx

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

Тестирование автообновления сертификата

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

Чтобы протестировать автообновление, можно запустить команду проления с опцией dry-run, что является частым обозначением «холостого» запуска, без реального действия:

sudo certbot renew --dry-run

В процессе автоматической установки Certbot добавляет событие в /etc/cron.d/certbot, вот пример записи, которая пригодится тем, уто генерирует сертификат вручную:

0 */12 * * * root test -x /usr/bin/certbot -a ! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew

Расшифровка записи такова: Задача выполняется каждые 12 часов. Если у /usr/bin/certbot есть права на выполнение и, если нет директории /run/systemd/system будет выполнена команда обновления сертификатов. Но, если есть директория /run/systemd/system/, то в этом случае задача не будет выполнена, т.к. используется systemd (системный таймер, альтернатива CRON).

Проверить наличие системного таймера для Certbot, можно следющей командой:

sudo systemctl list-timers --all

В выводе должны присутствовать certbot.timer и certbot.service.

Системный таймер имеет в наборе следующие файлы:

  • /lib/systemd/system/certbot.timer
  • /lib/systemd/system/certbot.service

Первый файл содержит информацию о тайминге выполнения, а во втором непосредственно команда на выполнение:

ExecStart=/usr/bin/certbot -q renew

Её можно можифицировать, если потребуется. Например параметр -q означает «quiet», т.е. без вывода в stdout. Так же есть параметр --noninteractive, чтобы не ждать ввода от пользователя и т.п.

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

certbot -q renew --noninteractive --post-hook "systemctl restart nginx.service"


Чтож, надеюсь материал оказался полезным. Делитесь, ставьте лайки и отключите блокировщик рекламы 😉

Материалы:

Инструкции по теме:

Добавить комментарий