Интерактивный скрипт для автоматического получения, управления и обновления SSL-сертификатов Let's Encrypt с поддержкой Cloudflare API и wildcard-сертификатов.
- Получение SSL-сертификатов через Let's Encrypt
- Поддержка Cloudflare API для получения wildcard-сертификатов
- Стандартный ACME-вызов для обычных доменов
- Автоматическое обновление сертификатов через cron
- Объединение PEM-файлов для совместимости с HAProxy и другими сервисами
- Настраиваемые хуки для перезапуска служб после обновления
- Интерактивное меню для удобного управления
- Мониторинг статуса сертификатов с отображением срока действия
- Автоматическое обновление скрипта с GitHub
- ОС: Ubuntu 22.04 (протестировано)
- Права: root или sudo доступ
- Порт 80: должен быть открыт для ACME-вызовов (при использовании стандартного метода)
Скрипт автоматически установит следующие пакеты, если они отсутствуют:
certbot- клиент Let's Encryptpython3-certbot-dns-cloudflare- плагин Cloudflare для Certbotufw- утилита управления файрволомcurl- для HTTP-запросовdnsutils- для DNS-запросов (команда dig)cron- планировщик задач
bash <(curl -Ls https://raw.githubusercontent.com/xxphantom/cert-manager/main/install.sh)После первого запуска вы можете установить скрипт в систему:
# В интерактивном меню выберите опцию "9. Установить/обновить этот скрипт"
# Или используйте команду:
sudo ./install.sh installПосле установки скрипт будет доступен глобально:
cert-managerЕсли скрипт уже установлен в системе, при запуске будет предложено его обновить с GitHub:
# Обновление до последней версии
sudo cert-manager
# В меню выберите "9. Обновить этот скрипт"Запустите скрипт без параметров для входа в интерактивное меню:
sudo cert-managerСкрипт поддерживает следующие команды:
# Показать статус всех сертификатов
sudo cert-manager status
# Получить новый сертификат (интерактивно)
sudo cert-manager get
# Принудительно обновить все сертификаты
sudo cert-manager renew
# Настроить хуки для доменов
sudo cert-manager sethook
# Установить/обновить скрипт в системе
sudo cert-manager install- Поддержка wildcard-сертификатов (*.example.com)
- Не требует открытых портов на сервере
- Автоматическая DNS-валидация через Cloudflare API
- ECDSA-ключи с кривой secp384r1 для повышенной безопасности
Требования:
- Домен должен использовать DNS Cloudflare
- API-токен Cloudflare с правами на редактирование DNS
Процесс:
- Введите основной домен (например,
example.com) - Введите email для уведомлений Let's Encrypt
- Введите API-токен Cloudflare
- Скрипт автоматически получит сертификат для
example.comи*.example.com
- HTTP-01 валидация через порт 80
- Подходит для отдельных доменов без wildcard
- Требует доступности порта 80 извне
Требования:
- Порт 80/tcp должен быть открыт и доступен
- Домен должен указывать на IP-адрес сервера
Скрипт автоматически настраивает cron-задачу для ежедневной проверки обновлений:
0 4 * * * /usr/bin/certbot renew --quietДля совместимости с HAProxy, и другими сервисами, скрипт автоматически создает объединенный файл full.pem, содержащий:
- Приватный ключ (
privkey.pem) - Полную цепочку сертификатов (
fullchain.pem)
Расположение файлов:
/etc/letsencrypt/live/example.com/
├── privkey.pem # Приватный ключ
├── fullchain.pem # Полная цепочка сертификатов
└── full.pem # Объединенный файл (создается автоматически)
Хуки позволяют автоматически перезапускать службы после обновления сертификатов.
Примеры команд хуков:
# Перезагрузка Nginx
systemctl reload nginx
# Перезапуск Docker-контейнера
docker restart my_containerАвтоматический deploy-хук:
Скрипт устанавливает специальный deploy-хук в /etc/letsencrypt/renewal-hooks/deploy/01-cert-manager-pem-combiner, который автоматически создает объединенные PEM-файлы при каждом обновлении сертификата.
Скрипт поддерживает автоматическое обновление с GitHub:
Процесс обновления:
- Скрипт проверяет, установлен ли он в системе
- Если установлен, предлагает обновление вместо установки
- Скачивает последнюю версию с GitHub
- Заменяет текущий файл новой версией
- Сохраняет права доступа и настройки
Учетные данные Cloudflare:
/etc/letsencrypt/cloudflare/credentials.ini
Конфигурации обновления доменов:
/etc/letsencrypt/renewal/example.com.conf
Deploy-хук для объединения PEM:
/etc/letsencrypt/renewal-hooks/deploy/01-cert-manager-pem-combiner
Функция "Показать статус сертификатов" отображает:
- Список всех доменов с активными сертификатами
- Пути к файлам сертификатов и ключей
- Срок действия с цветовой индикацией:
- 🔴 Красный: менее 14 дней
- 🟡 Желтый: менее 30 дней
- 🟢 Зеленый: более 30 дней
- Настроенные хуки для каждого домена
- Статус объединенных файлов full.pem
- Скрипт требует root-права для работы с системными файлами
- Файлы с учетными данными Cloudflare имеют права 600 (только root)
- Все операции с сертификатами выполняются от имени root
- ECDSA-ключи с кривой secp384r1
- Более безопасные по сравнению с RSA при меньшем размере ключа
- Поддерживаются всеми современными браузерами и серверами
Скрипт автоматически проверяет доступность порта 80 через UFW:
# Открыть порт 80 если необходимо
sudo ufw allow 80/tcpЧтобы не допустить ошибок при получении сертификата, скрипт сравнивает IP сервера с IP домена:
# Проверить IP домена
dig +short A example.com
# Проверить IP сервера
curl -s -4 ifconfig.me# Просмотр логов Certbot
sudo tail -f /var/log/letsencrypt/letsencrypt.log
# Тестовый запуск обновления
sudo certbot renew --dry-run# Просмотр cron-задач root
sudo crontab -l
# Проверка работы cron
sudo systemctl status cron# Проверить статус UFW
sudo ufw status
# Открыть порт 80
sudo ufw allow 80/tcp
# Проверить, что порт не занят
sudo netstat -tlnp | grep :80- Проверьте правильность API-токена
- Убедитесь, что токен имеет права на редактирование DNS
- Проверьте, что домен использует DNS Cloudflare
# Принудительное обновление с подробным выводом
sudo certbot renew --force-renewal --verbose
# Проверка конфигурации обновления
sudo cat /etc/letsencrypt/renewal/example.com.conf- Запустите скрипт:
sudo bash <(curl -fsSL https://raw.githubusercontent.com/xxphantom/cert-manager/main/install.sh)илиsudo cert-manager(если уже установлен) - Выберите "2. Получить новый сертификат"
- Выберите "1. Cloudflare API"
- Введите домен:
example.com - Введите email и API-токен Cloudflare
- Настройте хук:
systemctl reload nginx
После получения сертификата используйте объединенный файл:
# В конфигурации HAProxy
bind *:443 ssl crt /etc/letsencrypt/live/example.com/full.pem
Настройте хук для перезапуска контейнера:
# В настройках хука
docker restart my_web_containerПри возникновении проблем:
- Проверьте логи:
/var/log/letsencrypt/letsencrypt.log - Запустите диагностику:
sudo cert-manager status - Проверьте cron-задачи:
sudo crontab -l - Выполните тестовое обновление:
sudo certbot renew --dry-run
Этот скрипт распространяется свободно для использования и модификации.