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