Автоматизация SSL сертификатов для Selectel Object Storage (S3) — делюсь готовым решением
Привет всем!
Хочу поделиться скриптом, который написал для автоматизации SSL сертификатов на Selectel Object Storage. Может, кому-то пригодится — сам пользуюсь уже несколько месяцев без проблем.
Как всё началось
У меня хранилище форума расположено на S3 у Selectel. Но чтобы все работало - нужно для домена привязанного в S3 выпускать сертификат (домен должен быть привязан к серверу на котором работает форум)
Надоело каждый раз лазить в панель и вручную перезагружать сертификаты. Решил автоматизировать — пусть скрипт раз в месяц сам обновляет всё через Let’s Encrypt.
Что получилось
Скрипт умеет:
Автоматически обновлять сертификаты через acme.sh и Let’s Encrypt
Загружать их в Selectel через API (удаляя существующий там)
Проверять валидность сертификатов и ключей
Слать уведомления в Telegram когда что-то пошло не так (или наоборот, всё хорошо)
Обрабатывать rate limiting от Let’s Encrypt корректно (он проверяет сколько дней осталось и когда выпущен текущий.
Восстанавливаться из бэкапов если основные файлы acme.sh повредились
Ключевые фишки
Умная обработка ошибок
Если Let’s Encrypt выдаёт rate limit (а они дают только 5 сертификатов в неделю на набор доменов), скрипт не падает, а использует существующие валидные сертификаты. Сайт остаётся онлайн.
Автопоиск валидных пар
Иногда acme.sh создаёт новые сертификаты, но файлы обновляются не все. Скрипт сам найдёт подходящие пары сертификат+ключ в директории acme.sh.
Динамические пути
Указываешь только основной домен в конфиге — все пути к файлам генерируются автоматически. Удобно для разных доменов.
Настройка
Всё настраивается через .env файл:
# Данные от Selectel
SELECTEL_USERNAME=your_username
SELECTEL_PASSWORD=your_password
SELECTEL_ACCOUNT_ID=123456
SELECTEL_PROJECT_ID=your-project-id
SELECTEL_CONTAINER_NAME=your-container
# Домены
DOMAIN=yourdomain.com
# WILDCARD_DOMAIN=*.yourdomain.com # опционально
# Telegram уведомления
TELEGRAM_BOT_TOKEN=your_bot_token
TELEGRAM_CHAT_ID=your_chat_id
Wildcard домен можно вообще не указывать — тогда будет только основной домен.
Что нужно для работы
-
Python 3.6+
-
Установленный и настроенный acme.sh
-
Доступ к API Selectel (нужен service account)
-
Telegram бот (опционально, но рекомендую)
Как использую
Поставил в cron на первое число каждого месяца:
0 3 1 * * /path/to/ssl_renewal.py
Скрипт сам проверяет, нужно ли обновление, обновляет сертификаты, загружает в Selectel и шлёт уведомление в Telegram. Забыл про эту проблему.
Интересные детали реализации
Проблема с форматами ключей
Selectel принимает только PKCS#8 формат ключей, а acme.sh выдаёт RSA. Скрипт автоматически конвертирует через OpenSSL.
Валидация сертификатов
Перед загрузкой проверяется, что сертификат и ключ действительно подходят друг другу. Если нет — ищем альтернативные файлы.
Обработка API Selectel
У Selectel есть особенности в API — например, нужно ждать активации сертификата после загрузки. Всё это учтено.
Безопасность
-
Все чувствительные данные в
.envфайле -
Приватные ключи автоматически ставятся с правами 600
-
Перед любыми изменениями создаются бэкапы
-
В git не попадают сертификаты и креды (есть .gitignore)
Код и документация
Выложил всё на GitHub с подробной документацией на двух языках:
github.com/dignezzz/s3-ssl-selectel
Есть:
-
Подробный README на русском и английском
-
Примеры конфигурации
-
Troubleshooting для частых проблем
-
Примеры systemd сервисов
Приглашаю к обсуждению
Если кто-то тоже использует Selectel Object Storage, было бы интересно узнать ваш опыт:
-
Как решаете проблему с SSL сертификатами?
-
Сталкивались с глюками встроенного менеджера?
-
Есть идеи по улучшению скрипта?
Код под MIT лицензией — используйте как хотите. Если найдёте баги или у вас есть идеи улучшений, буду рад pull request’ам!
TL;DR: Написал скрипт для автоматизации SSL сертификатов на Selectel Object Storage. Работает через Let’s Encrypt + acme.sh, умеет обрабатывать ошибки, шлёт уведомления в Telegram. Использую 4 месяца без проблем. Код на GitHub под MIT лицензией.
