Автоматизация SSL сертификатов для Selectel Object Storage (S3)

:locked: Автоматизация SSL сертификатов для Selectel Object Storage (S3) — делюсь готовым решением

Привет всем!

Хочу поделиться скриптом, который написал для автоматизации SSL сертификатов на Selectel Object Storage. Может, кому-то пригодится — сам пользуюсь уже несколько месяцев без проблем.

:man_facepalming: Как всё началось

У меня хранилище форума расположено на S3 у Selectel. Но чтобы все работало - нужно для домена привязанного в S3 выпускать сертификат (домен должен быть привязан к серверу на котором работает форум)

Надоело каждый раз лазить в панель и вручную перезагружать сертификаты. Решил автоматизировать — пусть скрипт раз в месяц сам обновляет всё через Let’s Encrypt.

:rocket: Что получилось

Скрипт умеет:

:white_check_mark: Автоматически обновлять сертификаты через acme.sh и Let’s Encrypt

:white_check_mark: Загружать их в Selectel через API (удаляя существующий там)

:white_check_mark: Проверять валидность сертификатов и ключей

:white_check_mark: Слать уведомления в Telegram когда что-то пошло не так (или наоборот, всё хорошо)

:white_check_mark: Обрабатывать rate limiting от Let’s Encrypt корректно (он проверяет сколько дней осталось и когда выпущен текущий.

:white_check_mark: Восстанавливаться из бэкапов если основные файлы acme.sh повредились

:bullseye: Ключевые фишки

Умная обработка ошибок

Если Let’s Encrypt выдаёт rate limit (а они дают только 5 сертификатов в неделю на набор доменов), скрипт не падает, а использует существующие валидные сертификаты. Сайт остаётся онлайн.

Автопоиск валидных пар

Иногда acme.sh создаёт новые сертификаты, но файлы обновляются не все. Скрипт сам найдёт подходящие пары сертификат+ключ в директории acme.sh.

Динамические пути

Указываешь только основной домен в конфиге — все пути к файлам генерируются автоматически. Удобно для разных доменов.

:gear: Настройка

Всё настраивается через .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 домен можно вообще не указывать — тогда будет только основной домен.

:hammer_and_wrench: Что нужно для работы

  • Python 3.6+

  • Установленный и настроенный acme.sh

  • Доступ к API Selectel (нужен service account)

  • Telegram бот (опционально, но рекомендую)

:date: Как использую

Поставил в cron на первое число каждого месяца:


0 3 1 * * /path/to/ssl_renewal.py

Скрипт сам проверяет, нужно ли обновление, обновляет сертификаты, загружает в Selectel и шлёт уведомление в Telegram. Забыл про эту проблему.

:magnifying_glass_tilted_left: Интересные детали реализации

Проблема с форматами ключей

Selectel принимает только PKCS#8 формат ключей, а acme.sh выдаёт RSA. Скрипт автоматически конвертирует через OpenSSL.

Валидация сертификатов

Перед загрузкой проверяется, что сертификат и ключ действительно подходят друг другу. Если нет — ищем альтернативные файлы.

Обработка API Selectel

У Selectel есть особенности в API — например, нужно ждать активации сертификата после загрузки. Всё это учтено.

:locked: Безопасность

  • Все чувствительные данные в .env файле

  • Приватные ключи автоматически ставятся с правами 600

  • Перед любыми изменениями создаются бэкапы

  • В git не попадают сертификаты и креды (есть .gitignore)

:globe_showing_europe_africa: Код и документация

Выложил всё на GitHub с подробной документацией на двух языках:

:link: github.com/dignezzz/s3-ssl-selectel

Есть:

  • Подробный README на русском и английском

  • Примеры конфигурации

  • Troubleshooting для частых проблем

  • Примеры systemd сервисов

:handshake: Приглашаю к обсуждению

Если кто-то тоже использует Selectel Object Storage, было бы интересно узнать ваш опыт:

  • Как решаете проблему с SSL сертификатами?

  • Сталкивались с глюками встроенного менеджера?

  • Есть идеи по улучшению скрипта?

Код под MIT лицензией — используйте как хотите. Если найдёте баги или у вас есть идеи улучшений, буду рад pull request’ам!


TL;DR: Написал скрипт для автоматизации SSL сертификатов на Selectel Object Storage. Работает через Let’s Encrypt + acme.sh, умеет обрабатывать ошибки, шлёт уведомления в Telegram. Использую 4 месяца без проблем. Код на GitHub под MIT лицензией.

1 лайк