Сертификат DAT

1. Обзор

Сертификат DAT — это спецификация, управляющая правом выдачи DAT, а также алгоритмами подписи и шифрования токена и сведениями о ключах (Key).

Каждый сертификат имеет уникальный идентификатор (CID) и обеспечивает безопасное управление жизненным циклом токена, принудительно задавая период, в течение которого возможна выдача DAT, и срок действия (TTL) создаваемых токенов.

В DAT ротация ключей не является выбором. Период, в течение которого разрешена выдача, закреплён в сертификате на уровне спецификации, поэтому после его окончания создать новый токен этим сертификатом невозможно.


2. Структура сертификата

Проводной формат сертификата
cid
uint64 (шестн.)
.
start
uint64 (дес.)
.
duration
uint64 (дес.)
.
ttl
uint64 (дес.)
.
sig-alg
String
.
crypto-alg
String
.
sig-key
Base64Url
.
crypto-key
Base64Url
Наведите курсор на поле, чтобы увидеть описание.
cid . start . duration . ttl . sig-alg . crypto-alg . sig-key . crypto-key
Структура
Примерrefresh

2.1. Детальная спецификация полей

CID : Hex (uint64)

  • Уникальный идентификатор сертификата. Сопоставляется с полем CID в DAT и определяет, какой сертификат использовать при проверке.
  • CID — неизменяемый идентификатор. При замене ключа тот же CID не переиспользуется: выпускается сертификат с новым CID.

Время начала выдачи DAT : uint64 (Unix Time)

  • Обозначает время начала периода, в течение которого данный сертификат может использоваться для выдачи DAT, в секундах (Seconds).

Срок выдачи DAT : uint64 (Seconds)

  • Срок действия выдачи сертификата. По истечении данного периода (в секундах) с момента Время начала выдачи DAT выдавать новые DAT этим сертификатом нельзя.
  • Это длительность (duration), а не абсолютное время. Время окончания вычисляется как start + duration.

DAT TTL (Время жизни) : uint64 (Seconds)

  • Срок действия (Time To Live) DAT, выдаваемых этим сертификатом. При создании DAT значение expire устанавливается прибавлением этого значения ко времени выдачи.

Алгоритм подписи : String / Enum

  • Алгоритм подписи, используемый для создания и проверки поля signature в DAT.

Алгоритм шифрования : String / Enum

  • Алгоритм шифрования, используемый для шифрования и расшифрования поля secure в DAT.

Ключ подписи : Base64Url (Binary)

  • Данные ключа, используемого для подписи и проверки. (В зависимости от алгоритма это может быть Public/Private Key асимметричной пары либо симметричный ключ.)

Ключ шифрования : Base64Url (Binary)

  • Данные ключа шифрования, используемого для шифрования и расшифрования поля secure.

2.2. Вычисление времени

end    = start + duration        время окончания выдачи
expire = end + ttl               окончательное время истечения сертификата
  • Все вычисления выполняются в uint64, и ошибкой считается только переполнение.
  • duration = 0 и ttl = 0допустимые значения. Ими можно выразить сертификат, у которого окно выдачи закрывается немедленно, либо сертификат, выдающий токены, недействительные сразу по истечении.
  • Все поля — беззнаковые целые, поэтому отрицательных значений не существует на уровне типа.

2.3. Сигнатура конструктора

Все языковые реализации используют один и тот же порядок аргументов.

(cid, dat_issuance_start_seconds, dat_issuance_duration_seconds, dat_ttl_seconds,
 signature_key, crypto_key)

Третий аргумент — это длительность, а не время окончания

Если передать третьим аргументом абсолютное время окончания (end), ошибки не возникнет, но получится сертификат с совершенно неверным окном действия: значение как есть подставляется в start + duration.


3. Жизненный цикл сертификата

Четыре фазы сертификата
Создание
Начало выдачи
Окончание выдачи
Окончательное истечение
Задержка выдачи (delay)
Возможна выдача (duration)
DAT TTL
Время, чтобы все узлы получили сертификат
Возможны и выдача, и проверка DAT
Выдача невозможна, доступна только проверка
Сертификат окончательно истекает лишь после того, как пройдут все фазы: задержка выдачи → возможна выдача → остаток TTL для DAT.
ФазаВыдачаПроверкаПризнак
Задержка выдачиissuable() == false
Возможна выдачаissuable() == true
Остаток DAT TTLокно выдачи закрыто, но срок ещё не истёк
После окончательного истеченияexpired() == true
  • Возможность выдачи определяется как signable() && start <= now <= end, причём обе границы включаются.
  • Даже после закрытия окна выдачи сертификат живёт ещё ttl. Это нужно, чтобы токен, выданный непосредственно перед закрытием окна, успел прожить весь свой срок.
  • Фаза задержки выдачи (delay) нужна, чтобы дать всем узлам кластера время получить новый сертификат. Подробности смотрите в документе Синхронизация CMS.

4. Алгоритмы

4.1. Алгоритмы подписи

Список алгоритмов подписи для защиты DAT от подделки и изменения. Поддерживаются схемы с симметричным и асимметричным ключом.

НазваниеСхемаПримечание
ECDSA-P256асимметричнаяцифровая подпись на эллиптических кривых (NIST secp256r1)
ECDSA-P384асимметричнаяцифровая подпись на эллиптических кривых (NIST secp384r1)
ECDSA-P521асимметричнаяцифровая подпись на эллиптических кривых (NIST secp521r1)
HMAC-SHA256-MFSсимметричнаяKeyed-Hashing на основе секретного ключа фиксированного размера 256 бит
HMAC-SHA384-MFSсимметричнаяKeyed-Hashing на основе секретного ключа фиксированного размера 384 бита
HMAC-SHA512-MFSсимметричнаяKeyed-Hashing на основе секретного ключа фиксированного размера 512 бит

MFS (Maximum Fixed Secret): метод, при котором используется секретный ключ фиксированного размера в битах, равного размеру выходных данных (Output) хэш-алгоритма.

4.2. Алгоритмы шифрования

Список алгоритмов аутентифицированного шифрования (Authenticated Encryption) для защиты конфиденциальных данных внутри DAT (поле secure).

НазваниеДлина ключаСтруктура
IV-AES128-GCM128 битIV(96bit) + результат шифрования
IV-AES256-GCM256 битIV(96bit) + результат шифрования

Встраивание IV (Initialization Vector): уникальный 96-битный NONCE (IV), генерируемый при каждом шифровании, присоединяется в виде префикса (Prefix) перед результатом шифрования. При расшифровании первые 96 бит выделяются как IV и используются для расшифрования.

4.3. Проверка длины ключа

При импорте сертификата проверяется соответствие между разрядностью объявленного алгоритма и фактической длиной ключа.

Например, если в сертификате объявлен IV-AES256-GCM, а ключ имеет длину 16 байт, импорт будет отклонён. Без этой проверки система работала бы на AES-128, хотя все считали бы, что используется AES-256.


5. Экспорт verify-only

Серверам, которые выполняют только проверку, незачем передавать закрытый ключ подписи. Для этого сертификат DAT предоставляет экспорт verify-only.

Пути распространения полного сертификата и сертификата verify-only
DAT CMS
Сервер выдачи
Сервер только для проверки
GET /v1/certs
Полный сертификат (с закрытым ключом подписи)
GET /v1/certs/verify-only
Сертификат verify-only
запросраспространение сертификатов
Алгоритм подписиsupport_verify_only()Результат экспорта verify-only
Семейство ECDSAtrueвыгружается только открытый ключ подписи (Base64: 130 символов → 87)
Семейство HMACfalseвозникает явная ошибка

HMAC — симметричный алгоритм, поэтому «ключа только для проверки» у него не существует. Соответственно, попытка экспорта verify-only не пропускается молча, а немедленно сообщается как ошибка. Если среди сертификатов есть HMAC, вызов экспорта verify-only завершится неудачей, поэтому при эксплуатации узлов только для проверки следует использовать семейство ECDSA.

Ключ шифрования выгружается целиком даже в режиме verify-only

Ключ AES для поля secureсимметричный, поэтому всегда выгружается целиком, независимо от режима verify-only: для расшифрования нужен тот же ключ, что и для шифрования.

То есть сервер, получивший сертификат verify-only:

  • не может подделать подпись — без закрытого ключа он не создаст новый DAT;
  • может расшифровать полезную нагрузку secure — конфиденциальность от него не обеспечивается.

verify-only — это механизм разграничения права выдачи, а не конфиденциальности. Если значение нужно скрыть от узлов проверки, помещать его в secure нельзя.