Knowledge Base

Certificate Transparency (CT) — журнал выданных сертификатов

Certificate Transparency (CT Logs)

Категория: TLS / HTTPS · Риск: medium

Certificate Transparency (CT Logs)

Что такое CT

Certificate Transparency — открытая инфраструктура журналирования всех выданных TLS-сертификатов. Каждый браузер (Chrome с 2018, Safari с 2019) **отклоняет сертификаты**, не занесённые хотя бы в два независимых CT-журнала.

Зачем это важно для безопасности

1. **Обнаружение несанкционированных сертификатов**: если злоумышленник через социальную инженерию или взлом CA получит сертификат на ваш домен — он немедленно появится в CT-журнале 2. **Мониторинг поддоменов**: CT-журналы — главный источник для обнаружения новых поддоменов (инструменты: crt.sh, amass, subfinder) 3. **Compliance**: все публично доверенные CA обязаны логировать сертификаты в CT

Поиск всех выданных сертификатов

# Через crt.sh (публичный интерфейс к CT-журналам)
curl -s "https://crt.sh/?q=%.example.com&output=json" \
  | jq '.[].name_value' | sort -u

# Вывод включает все поддомены, для которых был выдан сертификат:
# *.example.com
# admin.example.com
# vpn.example.com
# staging.example.com

Мониторинг новых сертификатов

Настройте автоматический мониторинг через certspotter (бесплатный):

# Установка
go install software.sslmate.com/src/certspotter/cmd/certspotter@latest

# Запуск мониторинга
certspotter -watchlist watchlist.txt -script /path/to/notify.sh

# watchlist.txt:
example.com
.example.com  # включая поддомены

Или используйте SaaS-решения: [Cert Spotter by SSLMate](https://sslmate.com/certspotter/), [Facebook Certificate Transparency Monitoring](https://developers.facebook.com/tools/ct/).

Как проверить, что ваши сертификаты в CT

# Проверка через openssl — ищем SCT в сертификате
openssl s_client -connect example.com:443 2>/dev/null \
  | openssl x509 -noout -text \
  | grep -A 5 "CT Precertificate"

# Должны быть Signed Certificate Timestamps (SCT):
# CT Precertificate SCTs:
#   Signed Certificate Timestamp:
#     Version   : v1 (0x0)
#     Log ID    : ...

Использование CT для инвентаризации поддоменов

import requests

def get_subdomains(domain):
    r = requests.get(f"https://crt.sh/?q=%.{domain}&output=json", timeout=30)
    names = set()
    for cert in r.json():
        for name in cert["name_value"].split("\n"):
            names.add(name.strip().lstrip("*."))
    return sorted(names)

Что делать при обнаружении чужого сертификата

1. Немедленно свяжитесь с CA (они обязаны отозвать сертификат за 24 часа согласно CA/Browser Forum Baseline Requirements) 2. Проверьте CAA-записи вашего домена 3. Изучите логи авторизации ACME

Связанные проверки