Перейти к основному содержимому

Установка 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) и регулярно делайте бэкапы.