Let's Encrypt — предупредить до hit на rate-limit
Авто-релогирование сертификатов на 200 поддоменов — однажды попадаешь в Let's Encrypt rate-limit (50 certs/неделя на регистрируемый домен) и сидишь без HTTPS.
Рецепт
#!/usr/bin/env python3
# /opt/le-ratelimit-watch.py — daily cron
# Counts certs issued in the last 7 days from CT logs (crt.sh)
import urllib.request, json, sys, time, os
DOMAIN = os.environ['ROOT_DOMAIN'] # e.g. example.com
LIMIT = 50 # LE limit
WARN = 40 # alert when 80% used
WEBHOOK = os.environ.get('HEARTBEAT_URL', '')
url = f'https://crt.sh/?q=%25.{DOMAIN}&output=json'
req = urllib.request.Request(url, headers={'User-Agent': 'le-ratelimit-watch/1.0'})
data = json.loads(urllib.request.urlopen(req, timeout=30).read())
now = time.time()
recent = sum(1 for r in data
if (now - time.mktime(time.strptime(r['not_before'][:19], '%Y-%m-%dT%H:%M:%S'))) < 7*86400)
if recent >= WARN:
msg = f'LE rate limit: {recent}/{LIMIT} certs issued for {DOMAIN} in 7d'
if WEBHOOK:
urllib.request.urlopen(
urllib.request.Request(WEBHOOK,
data=json.dumps({'text': msg, 'count': recent}).encode(),
headers={'Content-Type': 'application/json'}),
timeout=10)
sys.exit(2)
print(f'OK ({recent}/{LIMIT} certs in 7d)')
То же самое в Enterno.io
Загрузите все 200 поддоменов в Enterno SSL Checker — увидите expiry per-host и общий dashboard, а не агрегат через crt.sh без привязки к конкретному сертификату.
Похожие рецепты
Caddy обычно сам обновляет cert, но один раз rate-limit от Let's Encrypt сорвал renewal — узнали за 2 дня до expiry. Нужен ежедневный двойной чек.
Самоподписанный скрипт проверяет SSL сертификат и шлёт алерт за 14 дней до expiry.
Сайт в HSTS preload-листе, но после рефакторинга nginx конфиг заголовок пропал. Через 3 месяца домен будет удалён из preload-листа. Нужен ежедневный чек.