Расширение Subject Key Identifier и Authority Key Identifier

Subject Key Identifier (SKI) и Authority Key Identifier (AKI) относятся к расширениям сертификатов X.509, которые используются для построения и проверки цепочек доверия в инфраструктуре открытых ключей (PKI). Эти расширения не влияют напрямую на криптографическую стойкость алгоритмов, но критически важны для идентификации ключей и корректной валидации цепочек сертификатов.

SKI представляет собой уникальный идентификатор, связанный с открытым ключом субъекта сертификата. AKI, в свою очередь, указывает на ключ центра сертификации (CA), который подписал данный сертификат. Совместное использование этих двух расширений позволяет однозначно связывать сертификаты между собой и предотвращать неоднозначности при построении цепочки доверия.


Расширения X.509 кодируются в формате ASN.1 и включаются в поле extensions сертификата.

Subject Key Identifier (SKI):

  • Обычно представляет собой хеш от публичного ключа (SHA-1 по классической схеме RFC 5280)
  • Используется как уникальный идентификатор ключа субъекта
  • Помогает ускорить поиск сертификата в хранилищах

ASN.1 представление:

SubjectKeyIdentifier ::= KeyIdentifier
KeyIdentifier ::= OCTET STRING

Authority Key Identifier (AKI):

  • Ссылается на ключ центра сертификации

  • Может содержать:

    • идентификатор ключа (keyIdentifier)
    • имя издателя (authorityCertIssuer)
    • серийный номер сертификата CA (authorityCertSerialNumber)

ASN.1 представление:

AuthorityKeyIdentifier ::= SEQUENCE {
    keyIdentifier             [0] KeyIdentifier           OPTIONAL,
    authorityCertIssuer       [1] GeneralNames            OPTIONAL,
    authorityCertSerialNumber [2] CertificateSerialNumber OPTIONAL
}

Роль SKI в идентификации ключа

SKI формируется на основе публичного ключа субъекта. В типичной реализации используется SHA-1 хеширование DER-представления публичного ключа.

В контексте Jsrsasign SKI может быть задан явно при генерации сертификата или вычислен автоматически.

Ключевая особенность SKI — стабильная привязка к ключевой паре. Если ключ не меняется, SKI остаётся тем же, даже если меняются другие параметры сертификата.


Роль AKI в построении цепочки доверия

AKI позволяет связать сертификат с сертификатом центра сертификации. При валидации цепочки:

  • AKI конечного сертификата сравнивается с SKI сертификата CA
  • Если совпадение найдено, цепочка считается потенциально валидной
  • Далее проверяется криптографическая подпись

Это ускоряет поиск родительского сертификата в больших PKI-системах.


Работа с SKI и AKI в Jsrsasign

Библиотека Jsrsasign предоставляет инструменты для создания и анализа X.509 сертификатов через объект X509 и генератор KEYUTIL / KJUR.asn1.x509.X509Ext.

Генерация сертификата с SKI и AKI

При создании сертификата через Jsrsasign расширения задаются в поле ext:

const { KEYUTIL, KJUR } = require("jsrsasign");

// Генерация ключей CA
const caKey = KEYUTIL.generateKeypair("RSA", 2048);
const caPrivateKey = caKey.prvKeyObj;
const caPublicKey = caKey.pubKeyObj;

// Генерация ключей субъекта
const userKey = KEYUTIL.generateKeypair("RSA", 2048);
const userPrivateKey = userKey.prvKeyObj;
const userPublicKey = userKey.pubKeyObj;

// Создание сертификата CA
const caCert = new KJUR.asn1.x509.Certificate({
    version: 3,
    serial: { int: 1 },
    issuer: { str: "/CN=Test CA" },
    subject: { str: "/CN=Test CA" },
    notbefore: "250101000000Z",
    notafter: "260101000000Z",
    sbjpubkey: caPublicKey,
    sigalg: "SHA256withRSA",
    ext: [
        {
            extname: "basicConstraints",
            cA: true
        },
        {
            extname: "subjectKeyIdentifier"
        }
    ],
    cakey: caPrivateKey
});

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


Сертификат пользователя с AKI

const userCert = new KJUR.asn1.x509.Certificate({
    version: 3,
    serial: { int: 2 },
    issuer: { str: "/CN=Test CA" },
    subject: { str: "/CN=User" },
    notbefore: "250101000000Z",
    notafter: "260101000000Z",
    sbjpubkey: userPublicKey,
    sigalg: "SHA256withRSA",
    ext: [
        {
            extname: "authorityKeyIdentifier",
            cakey: caPrivateKey
        },
        {
            extname: "subjectKeyIdentifier"
        }
    ],
    cakey: caPrivateKey
});

Здесь происходит важный момент: AKI вычисляется на основе ключа CA и автоматически включает его идентификатор.


Автоматическое формирование SKI

В Jsrsasign SKI может быть вычислен из публичного ключа через SHA-1. Внутри библиотеки это делается примерно по следующей логике:

  1. Получение DER-представления публичного ключа
  2. Применение SHA-1
  3. Использование результата как OCTET STRING

Пример явного формирования SKI:

{
    extname: "subjectKeyIdentifier",
    kid: true
}

Флаг kid: true указывает библиотеке использовать ключ для генерации идентификатора.


Связь SKI и AKI при валидации цепочки

При проверке сертификата цепочка строится следующим образом:

  1. Из конечного сертификата извлекается AKI
  2. В списке доверенных сертификатов ищется совпадающий SKI
  3. При совпадении выполняется проверка подписи

Логика сопоставления:

AKI (child certificate) → SKI (CA certificate)

Если AKI отсутствует, используется альтернативный механизм — сравнение issuer/subject, что менее эффективно и более подвержено ошибкам.


Разбор сертификата с SKI и AKI

Jsrsasign позволяет извлекать расширения из сертификата:

const x = new KJUR.asn1.x509.X509();
x.readCertPEM(userCert.getPEM());

const aki = x.getExtAuthorityKeyIdentifier();
const ski = x.getExtSubjectKeyIdentifier();

console.log("AKI:", aki);
console.log("SKI:", ski);

Результаты обычно представлены в hex или base64 формате в зависимости от конфигурации.


Типичные ошибки при работе с SKI и AKI

Несовпадение SKI и AKI

Возникает, если:

  • CA пересоздал ключ, но старые сертификаты остались
  • SKI был задан вручную и не соответствует публичному ключу

Отсутствие AKI

Некоторые старые сертификаты могут не содержать AKI, что усложняет построение цепочки.

Неправильная генерация SKI

Если использовать нестандартный алгоритм хеширования, идентификатор перестаёт быть совместимым с RFC 5280.


Практическая роль в инфраструктуре PKI

SKI и AKI активно используются в:

  • TLS/SSL цепочках сертификатов
  • Проверке подписи документов (PDF, XML)
  • VPN и корпоративных PKI
  • Смарт-картах и HSM

В реальных системах SKI служит первичным ключом индексации сертификатов, а AKI — связующим звеном между уровнями иерархии CA.


Особенности реализации в Jsrsasign

Jsrsasign ориентирован на совместимость с OpenSSL-подобными структурами, поэтому:

  • SKI чаще всего вычисляется автоматически
  • AKI строится на основе CA key material
  • Поддерживается RFC 5280 модель расширений
  • Возможна ручная настройка ASN.1 полей для сложных сценариев

При необходимости точного контроля можно формировать расширения через низкоуровневый API KJUR.asn1.x509.Extension.