Установка Certbot
Установка официального Certbot для получения бесплатных SSL сертификатов от Let's Encrypt.
Ubuntu/Debian
Установка через Snap (рекомендуемый способ)
sudo apt update
sudo apt install snapd
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Установка через репозиторий
sudo apt update
sudo apt install certbot python3-certbot-nginx
sudo apt install python3-certbot-dns-cloudflare
sudo apt install python3-certbot-dns-digitalocean
sudo apt install python3-certbot-dns-route53
CentOS/RHEL/Rocky Linux
Через EPEL репозиторий
sudo dnf install epel-release
sudo dnf install certbot python3-certbot-nginx
sudo dnf install python3-certbot-dns-cloudflare
sudo dnf install python3-certbot-dns-digitalocean
sudo dnf install python3-certbot-dns-route53
Через Snap
sudo dnf install snapd
sudo systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Arch Linux
sudo pacman -S certbot certbot-nginx
sudo pacman -S certbot-dns-cloudflare
sudo pacman -S certbot-dns-digitalocean
sudo pacman -S certbot-dns-route53
Проверка установки
certbot --version
certbot --help
Настройка автоматического обновления
Systemd timer (рекомендуемый способ)
sudo systemctl status snap.certbot.renew.timer
sudo systemctl list-timers | grep certbot
Cron (альтернативный способ)
sudo crontab -e
0 12 * * * /usr/bin/certbot renew --quiet && systemctl reload nginx
Проверка обновления
sudo certbot renew --dry-run
Настройка DNS плагинов
DNS валидация через DNS записи
Для доменов, которые недоступны через HTTP (например, wildcard сертификаты):
# Получение wildcard сертификата с ручной DNS валидацией
sudo certbot certonly \
--manual \
--preferred-challenges dns \
-d example.com \
-d "*.example.com"
# При выполнении команды Certbot попросит добавить TXT запись:
# Добавьте следующую DNS запись:
# _acme-challenge.example.com. TXT "random-string-here"
Автоматизация DNS валидации
Создание скрипта для добавления DNS записей
# /usr/local/bin/certbot-dns-hook.sh
#!/bin/bash
DOMAIN="$CERTBOT_DOMAIN"
VALIDATION="$CERTBOT_VALIDATION"
case "$1" in
"auth")
# Добавление TXT записи через API вашего DNS провайдера
echo "Добавьте TXT запись:"
echo "_acme-challenge.$DOMAIN TXT $VALIDATION"
read -p "Нажмите Enter после добавления записи..."
;;
"cleanup")
# Удаление TXT записи
echo "Удалите TXT запись:"
echo "_acme-challenge.$DOMAIN TXT $VALIDATION"
;;
esac
chmod +x /usr/local/bin/certbot-dns-hook.sh
# Использование скрипта
sudo certbot certonly \
--manual \
--manual-auth-hook /usr/local/bin/certbot-dns-hook.sh \
--manual-cleanup-hook /usr/local/bin/certbot-dns-hook.sh \
--preferred-challenges dns \
-d example.com
Cloudflare
sudo mkdir -p /etc/letsencrypt/dns-credentials
sudo nano /etc/letsencrypt/dns-credentials/cloudflare.ini
Содержимое файла:
dns_cloudflare_api_token = your_api_token_here
sudo chmod 600 /etc/letsencrypt/dns-credentials/cloudflare.ini
DigitalOcean
sudo nano /etc/letsencrypt/dns-credentials/digitalocean.ini
Содержимое:
dns_digitalocean_token = your_do_token_here
sudo chmod 600 /etc/letsencrypt/dns-credentials/digitalocean.ini
AWS Route53
sudo nano /etc/letsencrypt/dns-credentials/route53.ini
Содержимое:
dns_route53_access_key_id = your_access_key
dns_route53_secret_access_key = your_secret_key
sudo chmod 600 /etc/letsencrypt/dns-credentials/route53.ini
Настройка веб-хука для автоматизации
Скрипт для перезагрузки Nginx
sudo nano /etc/letsencrypt/renewal-hooks/deploy/nginx-reload.sh
Содержимое:
#!/bin/bash
systemctl reload nginx
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/nginx-reload.sh
Скрипт для уведомлений
sudo nano /etc/letsencrypt/renewal-hooks/deploy/notify.sh
Содержимое:
#!/bin/bash
DOMAIN="$RENEWED_DOMAINS"
EMAIL="admin@example.com"
if [ -n "$DOMAIN" ]; then
echo "SSL certificate for $DOMAIN has been renewed" | mail -s "SSL Certificate Renewed" $EMAIL
fi
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/notify.sh
Конфигурация для Docker
Docker Compose с автоматическим обновлением
version: '3.8'
services:
certbot:
image: certbot/certbot:latest
container_name: certbot
volumes:
- ./letsencrypt:/etc/letsencrypt
- ./www:/var/www/certbot
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
nginx:
image: nginx:latest
container_name: nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./letsencrypt:/etc/letsencrypt
- ./www:/var/www/certbot
depends_on:
- certbot
Nginx конфигурация для Docker
server {
listen 80;
server_name example.com;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
Мониторинг сертификатов
Скрипт проверки срока действия
#!/bin/bash
DOMAINS=("example.com" "www.example.com" "api.example.com")
THRESHOLD=30 # дней до истечения
for domain in "${DOMAINS[@]}"; do
expiry_date=$(echo | openssl s_client -servername $domain -connect $domain:443 2>/dev/null | openssl x509 -noout -dates | grep 'notAfter' | cut -d= -f2)
expiry_timestamp=$(date -d "$expiry_date" +%s)
current_timestamp=$(date +%s)
days_left=$(( (expiry_timestamp - current_timestamp) / 86400 ))
if [ $days_left -lt $THRESHOLD ]; then
echo "WARNING: Certificate for $domain expires in $days_left days"
# Отправить уведомление
echo "Certificate for $domain expires in $days_left days" | mail -s "SSL Certificate Warning" admin@example.com
else
echo "OK: Certificate for $domain is valid for $days_left days"
fi
done
Добавление в cron
sudo crontab -e
0 9 * * * /usr/local/bin/check-ssl-expiry.sh
Логирование и отладка
Включение подробного логирования
certbot --verbose renew
certbot --debug renew --dry-run
Просмотр логов
sudo tail -f /var/log/letsencrypt/letsencrypt.log
journalctl -u snap.certbot.renew.service
Резервное копирование сертификатов
Скрипт бэкапа
#!/bin/bash
BACKUP_DIR="/backup/letsencrypt"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
tar -czf $BACKUP_DIR/letsencrypt_backup_$DATE.tar.gz -C /etc letsencrypt/
find $BACKUP_DIR -name "letsencrypt_backup_*.tar.gz" -mtime +30 -delete
echo "Backup completed: $BACKUP_DIR/letsencrypt_backup_$DATE.tar.gz"
Восстановление из бэкапа
sudo systemctl stop nginx
sudo tar -xzf /backup/letsencrypt/letsencrypt_backup_YYYYMMDD_HHMMSS.tar.gz -C /etc/
sudo systemctl start nginx
Автоматизация
Настройте автоматическое обновление сертификатов и мониторинг их статуса для бесперебойной работы.
Безопасность
Храните файлы конфигурации DNS плагинов с правильными правами доступа (600) и регулярно делайте бэкапы.