Перейти к содержимому

Проверка SSL API: сертификат, TLS, HSTS и оценка A+…F

GET /v1/redirekto/ssl подключается к хосту по TLS, читает сертификат и цепочку, проверяет заголовок HSTS и ставит итоговую оценку от A+ до F со списком причин.

Параметр Тип Обязательный Описание
hostname string да имя хоста; протокол, путь и порт отбрасываются (https://seyka.ru/gid → seyka.ru)
port integer нет TLS-порт, 1–65535, по умолчанию 443
Окно терминала
curl -G https://proxy.seyka.ru/v1/redirekto/ssl \
-H "Authorization: Bearer $SEYKA_API_KEY" \
--data-urlencode "hostname=seyka.ru"
{
"hostname": "seyka.ru",
"grade": "A",
"gradeReasons": ["No HSTS header"],
"certificate": {
"subject": "seyka.ru",
"issuer": "R11",
"validFrom": "Sep 1 08:14:02 2026 GMT",
"validTo": "Nov 30 08:14:01 2026 GMT",
"daysUntilExpiry": 59,
"isExpired": false,
"subjectAltNames": ["seyka.ru", "www.seyka.ru"],
"fingerprint": "3A:9F:…:C4"
},
"tls": { "version": "TLSv1.3", "cipher": "TLS_AES_256_GCM_SHA384", "bits": 256 },
"hsts": { "enabled": false },
"chainValid": true,
"chainTrust": "trusted",
"chainLength": 3,
"chainTruncated": false,
"queryTimeMs": 184
}
Поле Описание
hostname проверенный хост (для кириллического — в punycode); hostnameDisplay — исходное написание
grade итоговая оценка: A+, A, B, C, D или F
gradeReasons причины оценки, строками на английском (см. ниже)
certificate если сертификат получен: subject и issuer (CN, иначе O), validFrom/validTo, daysUntilExpiry, isExpired, subjectAltNames, fingerprint (SHA-256, если есть)
tls если соединение установлено: согласованная версия протокола, шифр и длина ключа шифра в битах
hsts если удалось проверить: enabled; при наличии заголовка — maxAge (секунды), includeSubDomains, preload
chainValid цепочка проверяется — с учётом корневого сертификата Минцифры
chainTrust trusted, russian-ca или untrusted (см. ниже)
chainLength число сертификатов в цепочке
chainTruncated true, если цепочка длиннее, чем её разбирают
queryTimeMs время проверки, мс
error причина, если проверить не удалось

chainTrust разделяет три случая:

  • trusted — цепочка проверяется по стандартному набору корневых сертификатов браузеров.
  • russian-ca — цепочка не проверяется стандартным набором, но проверяется, если добавить корневой сертификат НУЦ Минцифры России (Russian Trusted Root CA). Сертификат исправен, chainValid: true, но большинство браузеров по умолчанию ему не доверяет. Так выглядят многие сайты на gov.ru и сайты, перешедшие на российские сертификаты, — это не «сломанная цепочка».
  • untrusted — цепочка не проверяется даже с корнем Минцифры (самоподписанный сертификат, не тот хост, нет промежуточного сертификата), либо сертификат получить не удалось.

Оценка F ставится сразу, если сертификата нет или он истёк, или сервер говорит по SSLv3. В остальных случаях баллы снимаются за:

Причина в gradeReasons Что означает
Expires within 7 days / Expires within 30 days скоро истекает
Certificate chain invalid chainTrust: "untrusted"
Chain relies on the Russian Trusted Root CA (Минцифры) — … chainTrust: "russian-ca", штраф небольшой
Outdated TLS version TLS 1.0 или 1.1
Weak cipher ключ шифра короче 128 бит
No HSTS header / HSTS max-age is low нет HSTS или max-age меньше года

A+ требует TLS 1.3 и включённого HSTS без существенных замечаний. Если замечаний нет, в gradeReasons будет Excellent configuration (A+) или Good configuration (A). Оценка F сразу приходит с одной из причин: Certificate expired, Insecure SSL version, Connection failed, Connection timed out, No certificate presented, Failed to parse certificate или Hostname could not be resolved; в пакете также Invalid hostname format и Blocked by SSRF protection.

POST /v1/redirekto/ssl принимает массив из 1–25 объектов {"hostname": "…", "port": 443} (port можно не указывать) и возвращает массив результатов в том же порядке:

Окно терминала
curl https://proxy.seyka.ru/v1/redirekto/ssl \
-H "Authorization: Bearer $SEYKA_API_KEY" \
-H "Content-Type: application/json" \
-d '[{"hostname": "seyka.ru"}, {"hostname": "example.com", "port": 8443}]'

В пакете некорректный хост не отклоняет запрос: его результат придёт с "grade": "F" и полем error. Общие правила — в обзоре Redirekto.

  • На подключение отводится 15 секунд, на проверку HSTS (запрос HEAD /) — 5 секунд; не ответивший на HSTS сервер считается работающим без HSTS.
  • Проверяются только публичные хосты. IP-адрес в числовой записи (2130706433, 0x7f000001), localhost, .local и адреса внутренней сети в GET отклоняются кодом 502, в пакете — результатом с error; обычный публичный IP проверяется. Имя, которое указывает на внутренний адрес, выглядит как нерезолвящееся: Hostname could not be resolved.
  • Хост с недопустимыми символами в GET — тоже 502. Коды — на странице Ошибки.

Каждый хост — один вызов, пакет — по числу элементов; повтор из кэша бесплатен. Цены и окно кэша — в таблице цен.