Info
Content

Certbot

Сертбот нужно запускать от рута, потому что ему нужно запускать свои скрипты и иметь доступ к директориям с сертами

Требуется:

  • python3.6+
  • root доступ в /etc/letsencrypt, /var/log/letsencrypt, /var/lib/letsencrypt
  • возможно биндиться на 80 порт в случае использования standalone режима
  • возможность чтения и редактирования конфига вебсервера в случае использования nginx/apache плагина

Если эти требования невыполнимы, то можно воспользоваться letsencrypt_nosudo или simp_le


Certbot можно установить через пакетный менеджер твоей ОС, snap или docker (крайне не рекомендуется, потому что сложно)

Обычно достаточно apt install certbot

Есть пакеты которые помогают certbot'у интегрироваться с apache/nginx и прочими сервисами

root@four:~# apt-cache search certbot | grep -v doc
certbot - automatically configure HTTPS using Let's Encrypt
python3-certbot - main library for certbot
python3-certbot-apache - Apache plugin for Certbot
python3-certbot-dns-cloudflare - Cloudflare DNS plugin for Certbot
python3-certbot-dns-digitalocean - DigitalOcean DNS plugin for Certbot
python3-certbot-dns-dnsimple - DNSimple DNS plugin for Certbot
python3-certbot-dns-gandi - Gandi LiveDNS plugin for Certbot
python3-certbot-dns-gehirn - Gehirn DNS plugin for Certbot
python3-certbot-dns-google - Google DNS plugin for Certbot
python3-certbot-dns-linode - Linode DNS plugin for Certbot
python3-certbot-dns-ovh - OVH DNS plugin for Certbot
python3-certbot-dns-rfc2136 - RFC 2136 DNS plugin for Certbot
python3-certbot-dns-route53 - Route53 DNS plugin for Certbot
python3-certbot-dns-sakuracloud - SakuraCloud DNS plugin for Certbot
python3-certbot-nginx - Nginx plugin for Certbot

Также можно установить через pip


Сертбот использует некоторое количество различных подкомманд для запроса различных действий: выпуск, перевыпуск, отзыв

Сертбот имеет два вида плагинов: аутентификаторы и инсталлеры

Аутентификаторы используются с командой certonly для получения сертификата:

  • Проверяют что ты контролируешь домен для которого запрашиваешь сертификат
  • Получают сертификат
  • Кладут его в /etc/letsencrypt

Инсталлеры используются с командой install для установки, и они уже могут модифицировать конфигурацию вебсервера

Плагины делающие и то и то вызываются через certbot run (run - дефолт, если не указана другая подкоманда). Так же в команде run можно определять четкие комбинации плагинов auth&install

Plugin Auth Inst Notes Use
apache Y Y Получение и установка сертификата для apache --apache
nginx Y Y Получение и установка сертификата для nginx certbot --nginx
webroot Y N Получение сертификата через запись в webroot запущенного вебсервера certonly --webroot \
--webroot-path PATH
standalone Y N Получение сертификата. Certbot вешается на 80 порт и таким образом проводит auth certonly --standalone
DNS plugins Y N Категория плагинов автоматизирующих получение сертификата через изменение DNS записей для подтверждения контроля над доменом. Это единственный способ получить wildcard сертификат
manual Y N Помогает получить сертификат давая инструкции для самостоятельной валидации домена. Позволяет использовать скрипты certonly --manual

Под капотом плагины используют один из нескольких acme протоколов для подтверждения контроля над доменом
Некоторые плагины поддерживает больше одного и тогда можно указать предпочитаемый через --preferred-challenges

Каждый домен будет использовать последний определенный перед ним webroot

certbot certonly --webroot -w /var/www/example -d www.example.com -d example.com \
    -w /var/www/other -d other.example.net -d another.other.example.net

Команда выше создаст один серт на все перечисленные домены. Если нужны раздельные серты, то команду нужно запускать несколько раз


webroot плагин создает временный файл для каждого запрошенного домена в ${webroo-path}/.well-known/acme-challenge/
А проверяющий сервер lets encrypt сделает запрос до этого временного файла

"GET /.well-known/acme-challenge/HGr8U1IeTW4kY_Z6UIyaakzOkyQgPr_7ArlLgtZE8SX HTTP/1.1"

Важно чтобы скрытая папка .well-known и ее содержимое было доступно через интернет для проверки (может потребоваться править конфиг вебсервера)


Плагин nginx корректно работает для большинства конфигураций, но нужно делать бэкап конфигов (несмотря на то что сертботовские изменения можно откатить через certbot --nginx rollback)


standalone режим позволяет получить сертификат не полагаясь на существующий вебсервер
Плагин вешается на 80/443 порт и сам становится вебсервером

--<challenge-type>-address позволяет указать интерфес и протокол на который нужно биндиться


Если нужно получить wildcard сертификат или сертбот запускается на сервере с которого нельзя провести проверку через webroot, то можно воспользоваться dns плагинами
Эти плагины устанавливаются отдельно и у них свои доки


manual плагин умеет http и dns проверку, можно указать желаемую через --preferred-challenges
Это то же самое что и автоматическая проверка, только не автоматическая
Проверка по http попросит положить временный файл в well-known сайта
А проверка по dns попросит добавить TXT запись

manual плагину можно указывать на скрипты предподготовки и очистки мусора после получения сертификата


Иногда нужно четко определить auth и install плагины, это можно делать через ключи

  • --authenticator/-a - auth plugin
  • --installer/-i - installer plugin

Пример

certbot run -a webroot -i apache -w /var/www/html -d example.com

Или можно пройти проверку вручную, а установить через плагин nginx (но автоматически такое не продлить)

Пример полной процедуры

root@four:~# certbot run -a manual -i nginx -d four.vandud.ru
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): s@vandud.ru

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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: Y
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for four.vandud.ru

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Create a file containing just this data:

bBGyo54bGqOsHD0tj9javAZLxoh6L4_OJHqY4cDadmg._OridQhxi5LDrFVF7NMSrzUfVRDYUuSXKz7wSkmQWYg

And make it available on your web server at this URL:

http://four.vandud.ru/.well-known/acme-challenge/bBGyo54bGqOsHD0tj9javAZLxoh6L4_OJHqY4cDadmg

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue 
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/default

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/sites-enabled/default

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://four.vandud.ru

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=four.vandud.ru
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/four.vandud.ru/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/four.vandud.ru/privkey.pem
   Your cert will expire on 2021-08-12. 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"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - 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

root@four:~#

Чтобы отобразить список сертификатов о которых знает сертбот нужно запустить подкоманду certificates

root@four:~# certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: four.vandud.ru
    Domains: four.vandud.ru
    Expiry Date: 2021-08-12 21:07:09+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/four.vandud.ru/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/four.vandud.ru/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Поле 'Certificate Name' содержит имя сертификата, которое можно использовать для перевыпуска (сертбот возьмет всю инфу из старого серта и перевыпустит)

--force-renewal, --duplicate и --expand контролируют поведение при пересоздании с существующим именем сертификата

  • --force-renewal - позволит перевыпустить раньше чем надо
  • --duplicate - создать новый независимый сертификат с доменами из указанного
  • --expand - перевыпустить старый серт и добавить новые домены

Рекомендуется использовать --cert-name вместо --expand, потому что больше контроля


Есть ограничение скорости перевыпуска сертификатов
Оно нужно для ограничения злоупотребления сервисом
Лимиты описаны здесь: https://letsencrypt.org/docs/rate-limits/


--cert-name позволяет модифицировать домены в сертификате
Например команда:

certbot certonly --cert-name example.com -d example.com

Перевыпустит сертификат example.com в котором два домена (example.com и www.example.com) только с example.com (уберет www.)


Сертбот поддерживате два типа приватных ключей: rsa и ecdsa
Через --key-type и --elliptic-curve можно этим управлять


Для отзыва нужно использовать подкоманду revoke
То какой сертификат отзывать, указывается двумя способами

  • --cert-name - имя сертификата из certbot certificates
  • --cert-path - путь до файла сертификата

Также при отзыве можно указать причину отзыва во флаге --reason

  • unspecified - default
  • keycompromise
  • affiliationchanged
  • superseded
  • cessationofoperation

По умолчанию сертбот для отзыва сертификата использует acme account key. Если сертификат был создан с того же аккаунта что и удаляется, то все получится

А если аккаунты разные, то для отзыва потребуется передать команде revoke еще и приватный ключ сертификата через --key-path

certbot revoke --cert-path /etc/letsencrypt/live/example.com/cert.pem \
    --key-path /etc/letsencrypt/live/example.com/privkey.pem

Если запустить команду certbot renew, то она попытается обновить сертификаты которые истекают меньше чем через 30 дней

renew в отличие от certonly изначально дизайнилась для автоматического использования и она может взаимодействовать сразу с множеством сертификатов


У renew есть pre и post хуки. Они позволяют выполнять команды до перевыпуска и после (например релоадить вебсервер)

  • --pre-hook "nginx -s stop"
  • --post-hook "nginx -s start"

Если хук свалится с ошибкой, то ошибка будет напечатана на экран, но обновление все равно продолжится

  • --deploy-hook - выполнится только после успешного обновления сертификата

/etc/letsencrypt - директория с конфигами сертбота

root@four:/etc/letsencrypt# tree -a
.
|-- accounts
|   `-- acme-v02.api.letsencrypt.org
|       `-- directory
|           `-- 1da4ab1e38f6367e285fbd28fc2ae0ca
|               |-- meta.json
|               |-- private_key.json
|               `-- regr.json
|-- archive
|   `-- four.vandud.ru
|       |-- cert1.pem
|       |-- chain1.pem
|       |-- fullchain1.pem
|       `-- privkey1.pem
|-- cli.ini
|-- csr
|   `-- 0000_csr-certbot.pem
|-- keys
|   `-- 0000_key-certbot.pem
|-- live
|   |-- four.vandud.ru
|   |   |-- cert.pem -> ../../archive/four.vandud.ru/cert1.pem
|   |   |-- chain.pem -> ../../archive/four.vandud.ru/chain1.pem
|   |   |-- fullchain.pem -> ../../archive/four.vandud.ru/fullchain1.pem
|   |   |-- privkey.pem -> ../../archive/four.vandud.ru/privkey1.pem
|   |   `-- README
|   `-- README
|-- options-ssl-nginx.conf
|-- renewal
|   `-- four.vandud.ru.conf
|-- renewal-hooks
|   |-- deploy
|   |-- post
|   `-- pre
|-- ssl-dhparams.pem
|-- .updated-options-ssl-nginx-conf-digest.txt
`-- .updated-ssl-dhparams-pem-digest.txt

Некоторые выполняемые файлы могут быть найдены в renewal-hooks
Хуки из этих папок (deploy,post,pre) только для renew и выполняются в алфавитном порядке
Это поведение выключается ключом --no-directory-hooks

Если команда certbot renew выполняется корректно и без вмешательста человека, то ее можно засунуть в cron

Если сертификат выпускается через certbot certonly в котором через ключ -d перечисляется все домены, то можно использовать ключ -n/--nonenteractive чтобы отключить запрос пользовательского ввода

--force-renewal - позволяет обновить серт игнорируя дату истечения (раньше чем за месяц обновить нельзя)
Это сделано специально, потому что у УЦ есть лимиты, и если все будут перевыпускать серты каждый день, то у УЦ что-то закончится

ЦА отправит алерт на почту если сертификат не будет продлен

No Comments
Back to top