Сертификат DAT
1. Обзор
Сертификат DAT — это спецификация, управляющая правом выдачи DAT, а также алгоритмами подписи и шифрования токена и сведениями о ключах (Key).
Каждый сертификат имеет уникальный идентификатор (CID) и обеспечивает безопасное управление жизненным циклом токена, принудительно задавая период, в течение которого возможна выдача DAT, и срок действия (TTL) создаваемых токенов.
В DAT ротация ключей не является выбором. Период, в течение которого разрешена выдача, закреплён в сертификате на уровне спецификации, поэтому после его окончания создать новый токен этим сертификатом невозможно.
2. Структура сертификата
cid . start . duration . ttl . sig-alg . crypto-alg . sig-key . crypto-key2.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. Жизненный цикл сертификата
| Фаза | Выдача | Проверка | Признак |
|---|---|---|---|
| Задержка выдачи | ✕ | ○ | 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-GCM | 128 бит | IV(96bit) + результат шифрования |
IV-AES256-GCM | 256 бит | 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.
| Алгоритм подписи | support_verify_only() | Результат экспорта verify-only |
|---|---|---|
| Семейство ECDSA | true | выгружается только открытый ключ подписи (Base64: 130 символов → 87) |
| Семейство HMAC | false | возникает явная ошибка |
HMAC — симметричный алгоритм, поэтому «ключа только для проверки» у него не существует. Соответственно, попытка экспорта verify-only не пропускается молча, а немедленно сообщается как ошибка. Если среди сертификатов есть HMAC, вызов экспорта verify-only завершится неудачей, поэтому при эксплуатации узлов только для проверки следует использовать семейство ECDSA.
Ключ шифрования выгружается целиком даже в режиме verify-only
Ключ AES для поля secure — симметричный, поэтому всегда выгружается целиком, независимо от режима verify-only: для расшифрования нужен тот же ключ, что и для шифрования.
То есть сервер, получивший сертификат verify-only:
- не может подделать подпись — без закрытого ключа он не создаст новый DAT;
- может расшифровать полезную нагрузку
secure— конфиденциальность от него не обеспечивается.
verify-only — это механизм разграничения права выдачи, а не конфиденциальности. Если значение нужно скрыть от узлов проверки, помещать его в secure нельзя.