Установим и настроим certbot для получения и обновления SSL сертификатов Let's Encrypt. Операционная система Ubuntu 22.04.4, веб-сервер Nginx.
Настраивать будем на примере развёрнутого SeaFile.
Let’s Encrypt — центр сертификации, начавший работу в бета-режиме с 3 декабря 2015 года, предоставляющий бесплатные криптографические сертификаты X.509 для TLS-шифрования (HTTPS). Процесс выдачи сертификатов полностью автоматизирован. https://letsencrypt.org/
Веб сервер работает, сайт, для которого требуется выпустить SSL сертификат, открывается по HTTP.
Работаем в sudo.
Установка certbot
Устанавливаем пакет для certbot:
apt-get update
apt-get install certbot
Устанавливаем пакет для nginx:
apt-get install python3-certbot-nginx
Запускаем:
certbot run --nginx
Указываем e-mail администратора сертификатов Let's Encrypt. Принимаем лицензионное соглашение и отвечаем на вопросы.
Скрипт выводит список доменов, которые он нашёл в Nginx. Указываем номер домена, для которого требуется сертификат. В данном случае пишем "1". Enter.
Если домены не нашлись, то ваш nginx, скорее всего, настроен на обслуживание любых доменов. В этом случае название домена нужно указать вручную.
Скрипт отработал, сгенерировал сертификаты (сроком на 3 месяца) и изменил конфигурационный файл сайта в nginx:
log_format seafileformat '$http_x_forwarded_for $remote_addr [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $upstream_response_time';
server {
server_name files.internet-lab.ru;
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/files.internet-lab.ru/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/files.internet-lab.ru/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_tokens off;
proxy_set_header X-Forwarded-For $remote_addr;
location / {
...
}
...
}
server {
if ($host = files.internet-lab.ru) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name _;
return 404;
}
Изменённые ботом строки подписаны:
# managed by Certbot
Приводим в порядок конфигурацию, иногда скрипт делает не то что надо.
Перезапускаем Nginx:
service nginx restart
Проверяем работу сайта по HTTPS:
Сайт работает.
Автоматическое обновление сертификатов
Срок действия SSL сертификатов Let's Encrypt — 3 месяца. Настроим автоматическое обновление.
certbot renew
Ошибок нет, наш сертификат не требует обновления. Проверим принудительное обновление:
certbot renew --force-renewal
Сертификат успешно обновляется. Certbot разрешает обновлять сертификат не чаще 5 раз в неделю. Если превысите лимит, то нужно ждать неделю.
Создаём сервис:
cd /etc/systemd/system/
vim certbot-renewal.service
Содержимое:
[Unit] Description=Certbot Renewal [Service] ExecStart=/usr/bin/certbot renew --force-renewal --post-hook "systemctl reload nginx.service"
Обращаю внимание на опцию --post-hook, с помощью этой опции мы будем обновлять конфигурационный файл nginx после перевыпуска сертификата.
Создаём таймер.
vim certbot-renewal.timer
Содержимое:
[Unit] Description=Timer for Certbot Renewal [Timer] OnBootSec=300 OnUnitActiveSec=1w [Install] WantedBy=multi-user.target
Включим таймер:
systemctl start certbot-renewal.timer
Автоматическое включение таймера:
systemctl enable certbot-renewal.timer
Статус таймера:
systemctl status certbot-renewal.timer
Последний запуск 19 секунд назад. Следующий через неделю.