Let's Encrypt. Получение и обновление сертификатов
Let's Encrypt — центр сертификации, предоставляющий бесплатные криптографические сертификаты X.509 для шифрования передаваемых через интернет данных HTTPS и других протоколов, используемых серверами в Интернете. При этом, процесс выдачи сертификатов полностью автоматизирован.
Проект Let's Encrypt создан для того, чтобы большая часть интернет-сайтов смогла перейти к шифрованным подключениям (HTTPS). На типичном веб-сервере на базе Linux требуется выполнить две команды, которые настроят HTTPS-шифрование, получат и установят сертификат за несколько секунд.Установка certbot с использованием apt
Чтобы SSL-сертификат от Let's Encrypt можно было выпустить и установить в конфигурацию веб-сервера, потребуется установить специальную утилиту certbot
, которая помогает решить две задачи.
- Получение сертификата — выполнение необходимых шагов аутентификации, чтобы доказать владение доменом, сохранение сертификата в директорию
/etc/letsencrypt/live/
и его регулярное продление. - При желании можно установить этот сертификат на веб-сервер — например, Apache или Nginx. Это делается путем изменения файлов конфигурации веб-сервера для использования полученного сертификата.
Вместе с утилитой certbot
часто используют плагины nginx
и apache
— их нужно установить вместе с утилитой certbot
. Плагины позволяет автоматизировать рутинные операции, но без них можно легко обойтись — мы рассмотрим оба варианта.
Если используется веб-сервер Nginx
# apt install certbot python3-certbot-nginx
Если используется веб-сервер Apache
# apt install certbot python3-certbot-apache
Плагины nginx
и apache
позволяют автоматизировать весь процесс — аутентификация, получение сертиката, изменение файлов конфигурации веб-сервера, обновление сертификата. Эти два плагина являются одновременно аутентификаторами и установщиками.
Аутентификаторы — это плагины, которые автоматически выполняют необходимые действия, чтобы доказать владение доменом, для которого запрашивается сертификат. Для получения сертификата всегда требуется аутентификатор.
Установщики — это плагины, которые могут автоматически изменять конфигурацию веб-сервера для обслуживания сайта по HTTPS, используя сертификаты, полученные certbot
. Установщик необходим для того, чтобы certbot
установил сертификат.
apt
будет установлена достаточно старая версия certbot
. Для получения более новой версии certbot
можно использовать установку с использованием snap
— это будет рассмотрено ниже.
Синтаксис утилиты certbot
Указывается подкоманда и опции. Если подкоманда на задана — подразумевается run
.
# certbot [подкоманда] [опции] [-d домен] [-d домен]
Часто используемые подкоманды и опции
certificates
— список всех сертификатов, полученных с помощьюcertbot
renew
— обновить все ранее полученные сертифкаты, которые будут найдены на сервереcertonly
— получить сертификат, но не устанавливать (не изменять файлы конфигурации веб-сервера)register
— регистрация в Let's Encrypt для дальнейшего получения и обновления сертификатов--dry-run
— протестироватьrenew
илиcertonly
без записи сертификатов на диск--nginx
— использовать плагинnginx
для получения и установки сертификата--apache
— использовать плагинapache
для получения и установки сертификата--webroot
— использовать плагинwebroot
для получения сертификата--force-renewal
— принудительно обновить сертификат, даже если срок действия не истекает-v
или--verbose
— подробный вывод, можно повторять, например-vvv
Регистрация в Let's Encrypt
Регистрация в Let's Encrypt требуется один раз и выполняется с помощью утилиты certbot
. Но это необязательно, можно зарегистрироваться при первом выпуске сертификата.
# certbot register --email somebody@yandex.ru Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.4-April-3-2024.pdf. You must agree in order to register with the ACME server. Do you agree? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: Y - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Would you be willing, once your first certificate is successfully issued, 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 Account registered.
На первом шаге запрашивается согласие с условиями использования сервиса Let's Encrypt, с которыми можно предварительно ознакомиться по предложенному адресу. На втором шаге предлагается выразить согласие на получение новостной рассылки от разработчиков certbot
.
Регистрация нужна для формирования ключевой пары, которой впоследствии подписываются все запросы, что позволяет удостовериться в подлинности отправителя. Это важно, так как все запросы передаются по открытым каналам и теоретически возможен их перехват и модификация.
Адрес электронной почты, указываемый при регистрации, используется для рассылки уведомлений, например, при неудачной попытке продления сертификата. Gоэтому следует указывать рабочий ящик, лучше всего собственный. Один и тот же адрес можно использовать для регистрации на разных хостах, ограничений в этом плане нет.
Учетная информация будет сохранена в каталог /etc/letsencrypt/accounts
, если содержимое данной директории будет утрачено, то нельзя будет продлить сертификаты и придется получать их заново, создав новый аккаунт. Это следует учитывать, например, при переносе системы на новый сервер.
Если необходимо изменить адрес электронной почты аккаунта, скажем при смене администратора, то это можно сделать командой
# certbot register --update-registration --email somebody@mail.ru
Следует помнить, что технической возможности восстановления аккаунта нет — в случае его утраты придется заново выпускать все сертификаты.
Конфигурация виртуального хоста
Когда плагин nginx
или apache
будет выполнять автоматическую установку SSL-сертификата, ему потребуется найти в конфигурационных файлах Nginx или Apache конкретные строки, чтобы внести необходимые изменения. Нужно проверить директивы ServerName
и ServerAlias
(в случае Apache) или server_name
(в случае Nginx) — что они указывают на домен, для которого планируется получить сертификат.
Если используется веб-сервер Nginx
# nano /etc/nginx/sites-available/example.com
server { listen 80; server_name example.com www.example.com; root /var/www/example.com/html; index index.html; location / { try_files $uri $uri/ =404; } access_log /var/log/nginx/example-com-access.log; error_log /var/log/nginx/example-com-error.log error; }
Если используется веб-сервер Apache
# nano /etc/apache2/sites-available/example.com.conf
<VirtualHost *:80> ServerName example.com ServerAlias www.example.com ServerAdmin webmaster@example.com DocumentRoot /var/www/example.com/html DirectoryIndex index.html ErrorLog ${APACHE_LOG_DIR}/example-com-error.log CustomLog ${APACHE_LOG_DIR}/example-com-access.log combined </VirtualHost>
Выпуск SSL-сертификата
Подготовка завершена, можно приступать непосредственно к выпуску и установке SSL-сертификата. Для установки, как уже упоминалось выше, можно использовать плагины, именно они изменят файл конфигурации виртуального хоста и перезапустят веб-сервер.
Если используется веб-сервер Nginx
# certbot --nginx --deploy-hook "systemctl reload nginx.service" -d example.com -d www.example.com
Если используется веб-сервер Apache
# certbot --apache --deploy-hook "systemctl reload apache2.service" -d example.com -d www.example.com
Произойдет запуск certbot
с плагином для Nginx или Apache, опция -d
необходима, чтобы обозначить доменные имена, для которых нужно получить сертификат.
Поскольку у Let's Encrypt есть лимиты на количество обращений за сертификатами, лучше всего для начала проверить, что сертификаты для целевого домена удастся получить, для этого выполняем команду ниже с флагом --dry-run
.
# certbot certonly --dry-run -d example.com -d www.example.com Saving debug log to /var/log/letsencrypt/letsencrypt.log Account registered. Simulating a certificate request for example.com and www.example.com The dry run was successful.
Если был пропущен шаг регистрации выше, появится сообщение с просьбой указать адрес эл.почты и принять условия обслуживания. Адрес почты лучше указать действующий, так как Let's Encrypt будет отправлять туда письма о проблемах и другие уведомления.
# certbot --nginx -d example.com -d www.example.com Saving debug log to /var/log/letsencrypt/letsencrypt.log Requesting a certificate for example.com and www.example.com Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/example.comfullchain.pem Key is saved at: /etc/letsencrypt/live/example.com/privkey.pem This certificate expires on 2024-08-31. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. Deploying certificate Successfully deployed certificate for example.com to /etc/nginx/sites-enabled/example.com Successfully deployed certificate for www.example.com to /etc/nginx/sites-enabled/example.com Congratulations! You have successfully enabled HTTPS on https://example.com and https://www.example.com
Плагин nginx
(или apache
) перезапишет файл конфигурации виртуального хоста и перезапустит веб-сервер.
# cat /etc/nginx/sites-available/example.com
server { server_name example.com www.example.com; root /var/www/example.com/html; index index.html; location / { try_files $uri $uri/ =404; } access_log /var/log/nginx/example-com-access.log; error_log /var/log/nginx/example-com-error.log error; listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = www.example.com) { return 301 https://$host$request_uri; } # managed by Certbot if ($host = example.com) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; server_name example.com www.example.com; return 404; # managed by Certbot }
Срок действия сертификата — 90 дней. Но при установке утилиты certbot
сразу настраивается автоматическое обновление сертификатов, которые истекают менее чем через 30 дней.
Автоматическое обновление
При установке утилиты certbot
добавляется таймер Systemd, который настроен на запуск два раза в день. Этот таймер дает сигнал службе certbot.service
, которая запускает утилиту certbot
с подкомандой renew
.
$ systemctl cat certbot.timer
# /lib/systemd/system/certbot.timer [Unit] Description=Run certbot twice daily [Timer] OnCalendar=*-*-* 00,12:00:00 RandomizedDelaySec=43200 Persistent=true [Install] WantedBy=timers.target
$ systemctl cat certbot.service
# /lib/systemd/system/certbot.service [Unit] Description=Certbot Documentation=file:///usr/share/doc/python-certbot-doc/html/index.html Documentation=https://certbot.eff.org/docs [Service] Type=oneshot ExecStart=/usr/bin/certbot --quiet renew PrivateTmp=true
Подкоманда renew
пытается обновить любые ранее полученные сертификаты, срок действия которых истекает менее чем через 30 дней. Для попытки продления будут использоваться те же плагины и опции, которые использовались во время первоначальной выдачи сертификата, если не будут указаны другие плагины или опции. Для этого при первом получении сертификата создается файл конфигурации.
$ cat /etc/letsencrypt/renewal/example.com.conf
# renew_before_expiry = 30 days version = 1.21.0 archive_dir = /etc/letsencrypt/archive/example.com cert = /etc/letsencrypt/live/example.com/cert.pem privkey = /etc/letsencrypt/live/example.com/privkey.pem chain = /etc/letsencrypt/live/example.com/chain.pem fullchain = /etc/letsencrypt/live/example.com/fullchain.pem # Options used in the renewal process [renewalparams] account = 7a589f20732ac7b4bf1d2fccce1a457c renew_hook = systemctl reload nginx.service authenticator = nginx installer = nginx server = https://acme-v02.api.letsencrypt.org/directory
Также есть смысл периодически проверять, как работает механизм автоматического перевыпуска — это можно сделать с помощью опции --dry-run
, которая не будет обновлять сертификат. Если ошибок при запуске не было — все в порядке.
$ certbot renew --dry-run
Использование плагина webroot
Плагин webrooot
является аутентификатором, но не установщиком — сертификат будет получен, но не будет установлен. В этом его отличие от плагинов nginx
и apache
— которые являются одновременно аутентификаторами и установщиками. Установить полученный сертификат можно вручную или использовать плагин nginx
или apache
как установщик.
В этом случае при установке certbot
нет необходимости в установке чего-то еще, как мы это делали выше, устанавливая плагин nginx
или apache
.
# apt install certbot
Для использования webrooot
нужен каталог, в который certbot
будет записывать свои файлы и который должен быть доступен из сети удостоверяющему серверу согласно протокола ACME. Давайте создадим такой каталог и сделаем его доступным для запросов извне по HTTP-протоколу.
# mkdir -p /var/www/letsencrypt/.well-known/acme-challenge
Если используется веб-сервер Nginx
# nano /etc/nginx/certbot.conf
location ^~ /.well-known/acme-challenge/ { root /var/www/letsencrypt/; default_type text/plain; }
# nano /etc/nginx/sites-available/example.com
server { listen 80; server_name example.com www.example.com; root /var/www/example.com/html; index index.html; # подключаем созданный файл конфигурации include /etc/nginx/certbot.conf; location / { try_files $uri $uri/ =404; } access_log /var/log/nginx/example-com-access.log; error_log /var/log/nginx/example-com-error.log error; }
Если используется веб-сервер Apache
# nano /etc/apache2/certbot.conf
Alias /.well-known/acme-challenge/ /var/www/letsencrypt/.well-known/acme-challenge/ <Directory "/var/www/letsencrypt/.well-known/acme-challenge/"> ForceType text/plain </Directory>
# nano /etc/nginx/sites-available/example.com.conf
<VirtualHost *:80> ServerName example.com ServerAlias www.example.com ServerAdmin webmaster@example.com DocumentRoot /var/www/example.com/html DirectoryIndex index.html # подключаем созданный файл конфигурации include /etc/apache2/certbot.conf ErrorLog ${APACHE_LOG_DIR}/example-com-error.log CustomLog ${APACHE_LOG_DIR}/example-com-access.log combined </VirtualHost>
Файл конфигурации certbot.conf
можно будет в дальнейшем использовать для всех прочих доменов, размещенных на веб-сервере. Подготовительные работы завершены, можно получать сертификат, для этого выполняем команду холостого прогона и потом команду получения сертификата.
# certbot certonly \ > --dry-run > --webroot > --webroot-path /var/www/letsencrypt > -d example.com > -d www.example.com
# certbot certonly \ > --webroot \ > --webroot-path /var/www/letsencrypt \ > --deploy-hook "systemctl reload nginx.service" \ > -d example.com \ > -d www.example.com
deploy-hook
при первом получении сертификата — потому как нужно сперва изменить файл конфигурации виртуального хоста веб-сервера и только потом дать команду Nginx перечитать файлы конфигурации. Это сделано для того, чтобы хук попал в файл конфигурации, который будет использовать certbot
при обновлении сертификата. Иначе потом придется редактировать файл конфигурации обновления сертификата, а это делать не рекомендуется.
Проверим, что файлы сертификатов получены и расположены в директории /etc/letsencrypt/live/example.com
(на самом деле, там только ссылки, но так и должно быть).
$ ls -la /etc/letsencrypt/live/example.com total 12 drwxr-xr-x 2 root root 4096 июн 3 14:49 . drwx------ 3 root root 4096 июн 2 13:46 .. lrwxrwxrwx 1 root root 39 июн 2 13:46 cert.pem -> ../../archive/example.com/cert1.pem lrwxrwxrwx 1 root root 40 июн 2 13:46 chain.pem -> ../../archive/example.com/chain1.pem lrwxrwxrwx 1 root root 44 июн 2 13:46 fullchain.pem -> ../../archive/example.com/fullchain1.pem lrwxrwxrwx 1 root root 42 июн 2 13:46 privkey.pem -> ../../archive/example.com/privkey1.pem -rw-r--r-- 1 root root 692 июн 2 13:46 README
После получения сертификата нужно вручную отредактировать файл конфигурации виртуального хоста и выполнить команду, чтобы Nginx перечитал файлы конфигурации.
# nano /etc/nginx/sites-available/example.com
server { listen 80; server_name example.com www.example.com; # редирект с http на https return 301 https://example.com$request_uri; } server { listen 443 ssl; server_name example.com www.example.com; # редирект с www.example.com на example.com if ($host = www.example.com) { return 301 https://example.com$request_uri; } root /var/www/example.com/html; index index.html; # файл конфигурации для обновления сертификатов include /etc/nginx/certbot.conf; location / { try_files $uri $uri/ =404; } # файлы сертификатов для работы по https ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; access_log /var/log/nginx/example-com-access.log; error_log /var/log/nginx/example-com-error.log error; }
# systemctl reload nginx.service
При обновлении сертификатов файл конфигурации веб-сервера редактировать не нужно — но нужно, чтобы чтобы Nginx перечитал файлы конфигурации и связанные файлы, в том числе новый сертификат. При ручном обновлении сертификата можно добавить хук deploy-hook
или просто дать команду Nginx перечитать файлы конфигурации.
# certbot renew --webroot --webroot-path /var/www/letsencrypt --deploy-hook "systemctl reload nginx.service"
Хук deploy-hook
срабатывает только в том случае, если сертификат был успешно получен или обновлен. Есть еще хук pre-hook
— срабатывает перед попыткой получения или обновления сертификата и хук post-hook
— срабатывает после попытки получения или обновления сертификата (даже если попытка была неудачной).
Не забываем о существовании файла конфигурации, директивы из которого будут использованы при запуске подкоманды renew
без дополнительных аргументов. Этот файл создается при первом получении сертифката и в дальнейшем используется при обновлении. Для автоматического обновления важно, чтобы в файле была директива renew_hook
, которая предписывает запустить хук deploy-hook
. Когда-то хук deploy-hook
назывался renew-hook
, но потом был переименован — а в файле осталось старое наименование.
$ cat /etc/letsencrypt/renewal/example.com.conf
# renew_before_expiry = 30 days version = 1.21.0 archive_dir = /etc/letsencrypt/archive/example.com cert = /etc/letsencrypt/live/example.com/cert.pem privkey = /etc/letsencrypt/live/example.com/privkey.pem chain = /etc/letsencrypt/live/example.com/chain.pem fullchain = /etc/letsencrypt/live/example.com/fullchain.pem # Options used in the renewal process [renewalparams] account = 07e19228dc4251d026dd2ee5b43bfcd8 renew_hook = systemctl reload nginx.service authenticator = webroot webroot_path = /var/www/letsencrypt, server = https://acme-v02.api.letsencrypt.org/directory [[webroot_map]] example.com = /var/www/letsencrypt www.example.com = /var/www/letsencrypt
certbot
настоятельно не рекомендуют редактировать этот файл вручную. Поэтому нужно первом получении сертификата добавить хук deploy-hook
— чтобы в файл конфигурации была добавлена соответствующая директива. Более новые версии certbot
поддерживают подкоманду reconfigure
для измения настроек обновления сертификата.
Автоматическое обновление при использовании webroot
работает сразу после первого получения сертификата. При установке утилиты certbot
добавляется таймер Systemd, который настроен на запуск два раза в день — чтобы проверять все сертификаты и перевыпускать те из них, которые истекают менее чем через 30 дней. Этот таймер дает сигнал службе certbot.service
, которая запускает утилиту certbot
с подкомандой renew
. Подкоманда renew
запускается без дополнительных опций, так что все настройки будут получены из файла конфигурации /etc/letsencrypt/renewal/example.com.conf
.
Использование плагина standalone
Плагин standalone
позволяет запустить встроенный в certbot
веб-сервер, чтобы ответить на http-запросы проверки принадлежности домена. Если уже есть работающий на 80-м порту веб-сервер — то его нужно остановить на время получения сертификата. В этом помогут хуки хук pre-hook
и post-hook
.
# certbot certonly --standalone -d example.com -d www.example.com
Аутентифкатор standalone
работает как аутентификаторы nginx
и apache
— создает необходимые файлы для проверки принадлежности домена без нашего участия. Автоматическое продление сертификата работает как обычно — через таймер certbot.timer
и службу certbot.service
.
$ cat /etc/letsencrypt/renewal/example.com.conf
# renew_before_expiry = 30 days version = 1.21.0 archive_dir = /etc/letsencrypt/archive/example.com cert = /etc/letsencrypt/live/example.com/cert.pem privkey = /etc/letsencrypt/live/example.com/privkey.pem chain = /etc/letsencrypt/live/example.com/chain.pem fullchain = /etc/letsencrypt/live/example.com/fullchain.pem # Options used in the renewal process [renewalparams] account = 7d09b0595db818aabf5632380d990d7c authenticator = standalone server = https://acme-v02.api.letsencrypt.org/directory
Использование плагина manual
Это очень похоже на использование плагина webroot
— нужна директория, содержимое которой доступно по HTTP-протоколу. При использвании webroot
— в эту директирию записываются файлы с определенным содержимым, чтобы подтвердить права на домен(ы). Для manual
— мы должны создать файлы самостоятельно.
# certbot certonly --manual --deploy-hook "systemctl reload nginx.service" -d example.com -d www.example.com .......... - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create a file containing just this data: 4EOgeJvzz5sotktiDFLwRG3OiqLA18Px9nAVUFByNjI.T8DgP_x2qmL6H_e1prH3N3yTlkXl6Ovtu5o1sG_jauw And make it available on your web server at this URL: http://www.example.com/.well-known/acme-challenge/4EOgeJvzz5sotktiDFLwRG3OiqLA18Px9nAVUFByNjI - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Press Enter to Continue Enter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create a file containing just this data: Bmg5cG9fflELO5glvMdKfqdGg-hUVpwXT6NUf83QNr8.T8DgP_x2qmL6H_e1prH3N3yTlkXl6Ovtu5o1sG_jauw And make it available on your web server at this URL: http://example.com/.well-known/acme-challenge/Bmg5cG9fflELO5glvMdKfqdGg-hUVpwXT6NUf83QNr8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Press Enter to Continue Enter только после создания файлов Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem Key is saved at: /etc/letsencrypt/live/example.com/privkey.pem This certificate expires on 2024-09-06. These files will be updated when the certificate renews. NEXT STEPS: This certificate will not be renewed automatically. Autorenewal of --manual certificates requires the use of an authentication hook script (--manual-auth-hook) but one was not provided. To renew this certificate, repeat this same certbot command before the certificate's expiry date.
Утилита certbot
сообщает, какие файлы нужно создать и что в них записать. После получения этой информации — нужно остановиться, открыть другой терминал и создать файлы. Потом вернуться в этот терминал и нажать Enter
— наличие этих файлов будет проверено с помощью HTTP-запросов. После чего будет получены сертификаты — которые нужно прописать в файле конфигурации веб-сервера.
# echo '4EOge...' > /var/www/letsencrypt/.well-known/acme-challenge/4EOgeJvzz5sotktiDFLwRG3OiqLA18Px9nAVUFByNjI # echo 'Bmg5c...' > /var/www/letsencrypt/.well-known/acme-challenge/Bmg5cG9fflELO5glvMdKfqdGg-hUVpwXT6NUf83QNr8
В самом конце утилита сообщает, что сертификаты не будет обновляться автоматически, для этого требуется скрипт проверки, который передается с помощью опции --manual-auth-hook
, который не был предоставлен. Пример такого скрипта можно найти в документации certbot
на сайте eff-certbot.readthedocs.io.
Конфигурационный файл
При запуске certbot
можно использовать опции или записать все насторойки в файла конфигурации /etc/letsencrypt/cli.ini
. Настройки из файла конфигурации будут использованы при каждом запуске certbot
.
# nano /etc/letsencrypt/cli.ini
# Because we are using logrotate for greater flexibility, # disable the internal certbot logrotation. max-log-backups = 0 # Adjust interactive output regarding automated renewal preconfigured-renewal = True
Директива max-log-backups
запрещает ротацию логов, потому что этим занимается служба logrotate
— при установке утилиты certbot
создается файл конфигурации.
$ cat /etc/logrotate.d/certbot /var/log/letsencrypt/*.log { rotate 12 weekly compress missingok }
Как отозвать сертификат
Сертификат можно отозвать, указав его имя (как правило, совпадает с именем домена) или путь к файлу сертификата.
# certbot revoke --cert-name example.com
# certbot revoke --cert-path /etc/letsencrypt/live/example.com/cert.pem
После отзыва certbot
спросит, нужно ли удалить сертификат локально. Если не удалить, certbot
попытается обновить отозванные сертификаты при следующем запуске обновления сертификатов. Удалить сертификат локально можно с помощью подкоманды delete
утилиты certbot
.
# certbot delete --cert-name example.com
Справка по certbot
Короткую справку по утилите certbot
можно получить с помощью опции --help
, подробное описание — с помощью опции --help all
.
$ certbot --help certbot [SUBCOMMAND] [options] [-d DOMAIN] [-d DOMAIN] ... Certbot can obtain and install HTTPS/TLS/SSL certificates. By default, it will attempt to use a webserver both for obtaining and installing the certificate. The most common SUBCOMMANDS and flags are: obtain, install, and renew certificates: (default) run Obtain & install a certificate in your current webserver certonly Obtain or renew a certificate, but do not install it renew Renew all previously obtained certificates that are near expiry enhance Add security enhancements to your existing configuration -d DOMAINS Comma-separated list of domains to obtain a certificate for (the certbot apache plugin is not installed) --standalone Run a standalone webserver for authentication --nginx Use the Nginx plugin for authentication & installation --webroot Place files in a server's webroot folder for authentication --manual Obtain certificates interactively, or using shell script hooks -n Run non-interactively --test-cert Obtain a test certificate from a staging server --dry-run Test "renew" or "certonly" without saving any certificates to disk manage certificates: certificates Display information about certificates you have from Certbot revoke Revoke a certificate (supply --cert-name or --cert-path) delete Delete a certificate (supply --cert-name) manage your account: register Create an ACME account unregister Deactivate an ACME account update_account Update an ACME account --agree-tos Agree to the ACME server's Subscriber Agreement -m EMAIL Email address for important account notifications More detailed help: -h, --help [TOPIC] print this message, or detailed help on a topic; the available TOPICS are: all, automation, commands, paths, security, testing, or any of the subcommands or plugins (certonly, renew, install, register, nginx, apache, standalone, webroot, etc.) -h all print a detailed help page including all topics --version print the version number
Установка certbot с использованием snap
Будет установлена более новая версия certbot
, кроме того, не нужно отдельно устанавливать плагин nginx
или apache
.
$ sudo snap install --classic certbot $ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Основные команды certbot
Регистрация в Let's Encrypt для дальнейшего получения сертификата
$ sudo certbot register --email somebody@mail.ru
Получение и установка сертификата, если используется веб-сервер Nginx
$ sudo certbot --nginx --deploy-hook "systemctl reload nginx.service" -d example.com -d www.example.com
Получение и установка сертификата, если используется веб-сервер Apache
$ sudo certbot --apache --deploy-hook "systemctl reload apache2.service" -d example.com -d www.example.com
Получение сертификата без установки, если используется веб-сервер Nginx
$ sudo certbot certonly --nginx --deploy-hook "systemctl reload nginx.service" -d example.com -d www.example.com
Получение сертификата без установки, если используется веб-сервер Apache
$ sudo certbot certonly --apache --deploy-hook "systemctl reload apache2.service" -d example.com -d www.example.com
Проверка автоматического обновления сертификата
$ sudo certbot renew --dry-run
Сертификат для Nginx
Получение сертификата с использованием плагина, установка вручную
$ sudo certbot certonly --nginx -d example.com -d www.example.com
Редактируем файл конфигурации виртуального хоста веб-сервера Nginx
$ sudo nano /etc/nginx/sites-available/example.com
server { listen 80; server_name example.com www.example.com; # редирект с http на https return 301 https://example.com$request_uri; } server { listen 443 ssl; server_name example.com www.example.com; root /var/www/example.com/html; index index.html; location / { try_files $uri $uri/ =404; } ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; access_log /var/log/nginx/example-com-access.log; error_log /var/log/nginx/example-com-error.log error; }
Файл конфигурации для обновления сертификата
$ cat /etc/letsencrypt/renewal/example.com.conf
# renew_before_expiry = 30 days version = 2.11.0 archive_dir = /etc/letsencrypt/archive/example.com cert = /etc/letsencrypt/live/example.com/cert.pem privkey = /etc/letsencrypt/live/example.com/privkey.pem chain = /etc/letsencrypt/live/example.com/chain.pem fullchain = /etc/letsencrypt/live/example.com/fullchain.pem # Options used in the renewal process [renewalparams] account = 27d21ab2294258ab57924eadb37e814f authenticator = nginx installer = nginx server = https://acme-v02.api.letsencrypt.org/directory key_type = ecdsa
При первом получении сертификата забыл использовать хук deploy-hook
— нужно это исправить. Иначе после обновления сертификата Nginx продолжит работать со старым. Файл конфигурации обновления сертификата не рекомендуется редактировать вручную, вместо этого предлагается использовать подкоманду reconfigure
.
$ sudo certbot reconfigure --cert-name example.com --deploy-hook "systemctl reload nginx.service" --run-deploy-hook
При запуске утилиты certbot
с опцией dry-run
или reconfigure
— хук deploy-hook
не запускается. Опция run-deploy-hooks
позволяет изменить это — можно проверить статус службы nginx.service
, что хук действительно отработал.
$ sudo systemctl status nginx.service ● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2024-06-09 10:23:06 MSK; 79min ago Docs: man:nginx(8) Process: 2073 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Process: 2074 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Process: 2315 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS) Main PID: 2075 (nginx) Tasks: 2 (limit: 1067) Memory: 3.9M CPU: 166ms CGroup: /system.slice/nginx.service ├─2075 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;" └─2316 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" июн 09 10:23:06 example.com systemd[1]: Starting A high performance web server and a reverse proxy server... июн 09 10:23:06 example.com systemd[1]: Started A high performance web server and a reverse proxy server. июн 09 11:42:27 example.com systemd[1]: Reloading A high performance web server and a reverse proxy server... июн 09 11:42:27 example.com systemd[1]: Reloaded A high performance web server and a reverse proxy server.
Файл конфигурации для обновления сертификата
$ cat /etc/letsencrypt/renewal/example.com.conf
# renew_before_expiry = 30 days version = 2.11.0 archive_dir = /etc/letsencrypt/archive/example.com cert = /etc/letsencrypt/live/example.com/cert.pem privkey = /etc/letsencrypt/live/example.com/privkey.pem chain = /etc/letsencrypt/live/example.com/chain.pem fullchain = /etc/letsencrypt/live/example.com/fullchain.pem # Options used in the renewal process [renewalparams] account = 27d21ab2294258ab57924eadb37e814f authenticator = nginx installer = nginx server = https://acme-v02.api.letsencrypt.org/directory key_type = ecdsa renew_hook = systemctl reload nginx.service
Сертификат для Apache
Давайте посмотрим еще, какие изменения в файлах конфигурации Apache выполняет certbot
, если использовать плагин apache
как аутентификатор и установщик.
$ sudo certbot --apache --deploy-hook "systemctl reload apache2.service" -d example.com -d www.example.com
$ cat /etc/apache2/sites-available/example.com.conf
<VirtualHost *:80> ServerName example.com ServerAlias www.example.com ServerAdmin webmaster@example.com DocumentRoot /var/www/example.com/html DirectoryIndex index.html RewriteEngine on RewriteCond %{SERVER_NAME} =example.com [OR] RewriteCond %{SERVER_NAME} =www.example.com RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] ErrorLog ${APACHE_LOG_DIR}/example-com-error.log CustomLog ${APACHE_LOG_DIR}/example-com-access.log combined </VirtualHost>
$ cat /etc/apache2/sites-available/example.com-le-ssl.conf
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName example.com ServerAlias www.example.com ServerAdmin webmaster@example.com DocumentRoot /var/www/example.com/html DirectoryIndex index.html Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem ErrorLog ${APACHE_LOG_DIR}/example-com-error.log CustomLog ${APACHE_LOG_DIR}/example-com-access.log combined </VirtualHost> </IfModule>
Файл конфигурации для обновления сертификата
$ cat /etc/letsencrypt/renewal/example.com.conf
# renew_before_expiry = 30 days version = 2.11.0 archive_dir = /etc/letsencrypt/archive/example.com cert = /etc/letsencrypt/live/example.com/cert.pem privkey = /etc/letsencrypt/live/example.com/privkey.pem chain = /etc/letsencrypt/live/example.com/chain.pem fullchain = /etc/letsencrypt/live/example.com/fullchain.pem # Options used in the renewal process [renewalparams] account = 1953385a34edb11a5a1cd6cb8907edbe renew_hook = systemctl reload apache2.service authenticator = apache installer = apache server = https://acme-v02.api.letsencrypt.org/directory key_type = ecdsa
deploy-hook
является обязательным при первом получении сертификата? В противном случае, будет сформирован неправильный файл конфигурации обновления сертификата. И после обновления сертификата — веб-сервер продолжит работать со старым, пока не будет выполнена команда systemctl reload nginx
или systemctl reload apache2
.
- Apache2. Установка и настройка. Часть 1 из 2
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 12 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 11 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 10 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 9 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 8 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 7 из 12
Поиск: Apache • HTTP • HTTPS • Linux • Nginx • SSL • Настройка • Установка • LetsEncrypt • Сертификат • Ключ • certbot