Certbot (Русский)
Certbot — ACME-клиент от Фонда Электронных Рубежей, написанный на Python и обеспечивающий такие удобства, как автоматическая настройка веб-сервера и встроенный веб-сервер для вызова HTTP. Certbot рекомендован Let's Encrypt.
Установка
Установите пакет certbot.
Также доступны плагины для автоматической настройки и установки выданных сертификатов на веб-серверах:
- Плагин для nginx предоставляется пакетом certbot-nginx.
- Плагин для Apache HTTP Server предоставляется пакетом certbot-apache.
Настройка
Обратитесь к документации Certbot для получения дополнительной информации о создании и использовании сертификатов.
Плагины
Nginx
Плагин certbot-nginx предоставляет автоматическую настройку Nginx (Русский). Он пытается найти конфигурацию каждого домена, а также добавляет рекомендованные для безопасности параметры, настройки использования сертификатов и пути к сертификатам Certbot. См. примеры в разделе #Управление блоками server в Nginx.
Первоначальная настройка блоков server:
# certbot --nginx
Обновить сертификаты:
# certbot renew
Изменить сертификаты без изменения файлов конфигурации nginx:
# certbot --nginx certonly
См. статью Certbot-Nginx on Arch Linux для получения дополнительной информации и раздел #Автоматическое обновление.
Управление блоками server в Nginx
Следующий пример можно использовать во всех блоках server при управлении этими файлами вручную:
/etc/nginx/sites-available/example
server { listen 443 ssl http2; listen [::]:443 ssl http2; # Cлушать IPv6 ssl_certificate /etc/letsencrypt/live/домен/fullchain.pem; # Управляется Certbot'ом ssl_certificate_key /etc/letsencrypt/live/домен/privkey.pem; # Управляется Certbot'ом include /etc/letsencrypt/options-ssl-nginx.conf; .. }
См. раздел Nginx (Русский)#TLS/SSL для получения более подробной информации.
Также можно создать отдельный конфигурационный файл и включать его в каждый блок server:
/etc/nginx/conf/001-certbot.conf
ssl_certificate /etc/letsencrypt/live/домен/fullchain.pem; # Управляется Certbot'ом ssl_certificate_key /etc/letsencrypt/live/домен/privkey.pem; # Управляется Certbot'ом include /etc/letsencrypt/options-ssl-nginx.conf;
/etc/nginx/sites-available/example
server { listen 443 ssl http2; listen [::]:443 ssl http2; # Слушать IPv6 include conf/001-certbot.conf; .. }
Apache
Плагин certbot-apache предоставляет автоматическую настройку Apache HTTP Server (Русский). Он пытается найти конфигурацию каждого домена, а также добавляет рекомендованные для безопасности параметры, настройки использования сертификатов и пути к сертификатам Certbot. См. примеры в разделе #Управление виртуальными хостами Apache.
Первоначальная настройка виртуальных хостов:
# certbot --apache
Обновить сертификаты:
# certbot renew
Изменить сертификаты без изменения файлов конфигурации apache:
# certbot --apache certonly
См. статью Certbot-Apache on Arch Linux для получения дополнительной информации и раздел #Автоматическое обновление.
Управление виртуальными хостами Apache
Следующий пример можно использовать во всех виртуальных хостах при управлении этими файлами вручную:
/etc/httpd/conf/extra/001-certbot.conf
<IfModule mod_ssl.c> <VirtualHost *:443> Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /etc/letsencrypt/live/домен/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/домен/privkey.pem </VirtualHost> </IfModule>
/etc/httpd/conf/httpd.conf
<IfModule mod_ssl.c> Listen 443 </IfModule> Include conf/extra/001-certbot.conf ..
См. раздел Apache HTTP Server (Русский)#TLS/SSL для получения более подробной информации.
Webroot
- Метод Webroot требует HTTP на порту 80 для проверки Certbot.
- Имя сервера должно соответствовать имени соответствующего DNS.
- На хосте могут потребоваться разрешения, чтобы разрешить доступ для чтения к
http://domain.tld/.well-known[устаревшая ссылка 2021-11-07]
.
При использовании webroot-метода, клиент Certbot размещает ответ на вызов (challenge response) по адресу /путь/к/domain.tld/html/.well-known/acme-challenge/
, который используется для проверки.
Использование этого метода более рекомендовано, чем полностью ручная установка (manual-метод), так как он допускает автоматическое обновление сертификатов и упрощает управление ими. Однако использование плагинов может быть более предпочтительным, так как они обеспечивают полностью автоматическую настройку и установку.
Сопоставление (mapping) запросов ACME-challenge
Управление может быть упрощено путём сопоставления всех HTTP-запросов для /.well-known/acme-challenge/
в одну папку, например. /var/lib/letsencrypt
.
Этот каталог должен быть доступен для записи клиенту Certbot и веб-серверу (nginx или apache, запущенными под пользователем http):
# mkdir -p /var/lib/letsencrypt/.well-known # chgrp http /var/lib/letsencrypt # chmod g+s /var/lib/letsencrypt
nginx
Создайте файл с блоком location
и включите его в блок server
:
/etc/nginx/conf.d/letsencrypt.conf
location ^~ /.well-known/acme-challenge/ { allow all; root /var/lib/letsencrypt/; default_type "text/plain"; try_files $uri =404; }
Пример конфигурации блока server
:
/etc/nginx/servers-available/domain.conf
server { server_name domain.tld .. include conf.d/letsencrypt.conf; }
Apache
Создайте файл /etc/httpd/conf/extra/httpd-acme.conf
:
/etc/httpd/conf/extra/httpd-acme.conf
Alias /.well-known/acme-challenge/ "/var/lib/letsencrypt/.well-known/acme-challenge/" <Directory "/var/lib/letsencrypt/"> AllowOverride None Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec Require method GET POST OPTIONS </Directory>
Включив это в /etc/httpd/conf/httpd.conf
:
/etc/httpd/conf/httpd.conf
Include conf/extra/httpd-acme.conf
Получение сертификат(ов)
Запросите сертификат для domain.tld
, используя /var/lib/letsencrypt/
в качестве общедоступного пути:
# certbot certonly --email email@example.com --webroot -w /var/lib/letsencrypt/ -d domain.tld
Чтобы добавить (под)домен, включите все зарегистрированные домены, используемые в текущей установке:
# certbot certonly --email email@example.com --webroot -w /var/lib/letsencrypt/ -d domain.tld,sub.domain.tld
Чтобы обновить (все) текущий сертификат(ы):
# certbot renew
Смотрите #Автоматическое обновление в качестве альтернативного варианта.
Вручную
Если для используемого веб-сервера нет плагина, воспользуйтесь следующей командой:
# certbot certonly --manual
Если вы предпочитаете использовать DNS-запрос (запись TXT), используйте:
# certbot certonly --manual --preferred-challenges dns
Это автоматически проверяет ваш домен и создаёт закрытый ключ и пару сертификатов. Они будут размещены в /etc/letsencrypt/archive/ваш.домен/
, а в каталоге /etc/letsencrypt/live/ваш.домен/
будут созданы символические ссылки на них.
Затем вы можете вручную настроить веб-сервер для использования ключа и сертификата из каталога с символическими ссылками.
/etc/letsencrypt/live/ваш.домен/
с произвольным числом в конце. При этом Certbot автоматически обновляет символические ссылки в каталоге /etc/letsencrypt/live/ваш.домен/
, чтобы они ссылались на самые свежие сертификаты, так что при использовании этих символических ссылок вам не нужно менять конфигурацию веб-сервера, чтобы использовать обновлённые сертификаты.Расширенная настройка
Автоматическое обновление
systemd
Создайте systemd-службу certbot.service
:
/etc/systemd/system/certbot.service
[Unit] Description=Let's Encrypt renewal [Service] Type=oneshot ExecStart=/usr/bin/certbot renew --quiet --agree-tos
Если вы не используете плагин для управления веб-сервером, то его нужно будет перезагружать вручную для применения обновлённых сертификатов. Это можно сделать добавлением --deploy-hook "systemctl reload nginx.service"
к команде ExecStart
[1]. Разумеется, используйте httpd.service
вместо nginx.service
, если необходимо.
Добавьте таймер для проверки продления сертификата дважды в день и включите рандомизированную задержку, чтобы все запросы на продление были равномерно распределены в течение дня для уменьшения загрузки сервера Let's Encrypt [2]:
/etc/systemd/system/certbot.timer
[Unit] Description=Twice daily renewal of Let's Encrypt's certificates [Timer] OnCalendar=0/12:00:00 RandomizedDelaySec=1h Persistent=true [Install] WantedBy=timers.target
Включите и запустите certbot.timer
.
Автоматическое обновление wildcard-сертификатов
Процесс довольно прост. Для выпуска wildcard-сертификата необходимо выполнить DNS challenge request, используя протокол ACMEv2.
В то время как выпуск wildcard-сертификата вручную прост, его не так просто автоматизировать. DNS challenge представляет собой запись TXT, предоставленную клиентом certbot, которую необходимо установить вручную в DNS.
Нужно будет обновлять DNS при каждом обновлении сертификатов. Чтобы не делать это вручную, воспользуйтесь rfc2136, для которого в Certbot есть плагин, упакованный в certbot-dns-rfc2136. Также необходимо настроить DNS-сервер, чтобы разрешить динамическое обновление TXT-записей.
Настройка BIND для rfc2136
Сгенерируйте секретный TSIG-ключ:
$ tsig-keygen -a HMAC-SHA512 example-key
и добавьте его в файл конфигурации:
/etc/named.conf
... zone "domain.ltd" IN { ... // this is for certbot update-policy { grant example-key name _acme-challenge.domain.ltd. txt; }; ... }; key "example-key" { algorithm hmac-sha512; secret "секретный_ключ"; }; ...
Перезапустите named.service
.
Настройка certbot для rfc2136
Сгенерируйте файл конфигурации для плагина rfc2136.
/etc/letsencrypt/rfc2136.ini
dns_rfc2136_server = IP.АД.РЕ.С dns_rfc2136_name = example-key dns_rfc2136_secret = ВСТАВЬТЕ_КЛЮЧ_БЕЗ_КАВЫЧЕК dns_rfc2136_algorithm = HMAC-SHA512
Защитите файл с помощью chmod, убрав группу и другие разрешения, так как он содержит копию секретного ключа.
Запустите тест:
# certbot certonly --dns-rfc2136 --force-renewal --dns-rfc2136-credentials /etc/letsencrypt/rfc2136.ini --server https://acme-v02.api.letsencrypt.org/directory --email example@domain.ltd --agree-tos --no-eff-email -d 'domain.ltd' -d '*.domain.ltd'
Если проверка успешно пройдена и сертификаты получены, можно автоматизировать Certbot. В ином случае, что-то пошло не так и необходимо отладить вашу установку. Теперь всё сводится к запуску certbot renew
, см. #Автоматическое обновление.