Расширение Key Usage в сертификатах X.509 определяет допустимые криптографические операции, для которых может использоваться открытый ключ. Оно является критически важным элементом политики безопасности, поскольку ограничивает контекст применения ключа и предотвращает его использование вне заданных сценариев.
Расширение представляется в виде битовой маски, где каждый бит соответствует определённому назначению:
digitalSignature — подпись данныхnonRepudiation (или contentCommitment) —
неотказуемостьkeyEncipherment — шифрование ключейdataEncipherment — шифрование данныхkeyAgreement — согласование ключейkeyCertSign — подпись сертификатовcRLSign — подпись списков отзываencipherOnly — только шифрование (в контексте
keyAgreement)decipherOnly — только расшифрованиеВ ASN.1 расширение Key Usage определяется как BIT STRING:
KeyUsage ::= BIT STRING {
digitalSignature (0),
nonRepudiation (1),
keyEncipherment (2),
dataEncipherment (3),
keyAgreement (4),
keyCertSign (5),
cRLSign (6),
encipherOnly (7),
decipherOnly (8)
}
Внутри сертификата это расширение может быть отмечено как critical, что означает обязательность проверки клиентом.
Библиотека предоставляет инструменты для извлечения, анализа и проверки расширений сертификатов, включая Key Usage.
Для работы используется класс X509:
const x509 = new X509();
x509.readCertPEM(certPEM);
const ext = x509.getExtKeyUsage();
Метод getExtKeyUsage() возвращает массив строк,
соответствующих установленным флагам.
Для Key Usage используется:
const keyUsage = x509.getExtKeyUsageString();
или:
const keyUsageBin = x509.getExtKeyUsageBin();
Метод getExtKeyUsageString() возвращает строку вида:
digitalSignature,keyEncipherment
Это упрощённое представление для анализа логики приложения.
Метод getExtKeyUsageBin() возвращает бинарное значение,
соответствующее битовой маске, например:
10100000
Каждый бит интерпретируется согласно позиции.
if (keyUsage.includes("digitalSignature")) {
// разрешена проверка подписи
}
if (keyUsage.includes("keyEncipherment")) {
// допустимо использование для обмена ключами
}
if (keyUsage.includes("keyCertSign")) {
// сертификат может подписывать другие сертификаты
}
Важно учитывать, является ли расширение критическим:
const extInfo = x509.getExtInfo("keyUsage");
if (extInfo.critical) {
// обязательная проверка соответствия
}
Если расширение критическое и приложение его игнорирует — сертификат должен считаться недействительным.
В некоторых сценариях требуется доступ к сырому ASN.1:
const hex = x509.getExtHex("keyUsage");
Далее используется ASN.1 парсер:
const asn1 = ASN1HEX.getTLV(hex, 0);
Извлечение битовой строки:
const bitString = ASN1HEX.getV(hex, 0);
Интерпретация выполняется вручную, побитово.
При построении цепочки доверия важно учитывать:
keyCertSignfunction isCA(x509) {
const ku = x509.getExtKeyUsageString();
return ku.includes("keyCertSign");
}
Для серверных сертификатов ожидается:
digitalSignaturekeyEnciphermentПроверка:
function isValidForTLS(x509) {
const ku = x509.getExtKeyUsageString();
return ku.includes("digitalSignature") && ku.includes("keyEncipherment");
}
Key Usage задаёт базовые ограничения, тогда как Extended Key Usage (EKU) уточняет контекст применения:
В jsrsasign:
const eku = x509.getExtExtKeyUsageName();
Комбинированная проверка:
if (keyUsage.includes("digitalSignature") && eku.includes("serverAuth")) {
// сертификат подходит для HTTPS
}
Игнорирование Key Usage Использование ключа без проверки может привести к нарушению политики безопасности.
Неверная интерпретация битов Ошибки при работе с бинарным представлением могут привести к ложным выводам.
Пренебрежение критичностью Критические расширения требуют обязательной проверки.
const x509 = new X509();
x509.readCertPEM(certPEM);
const ku = x509.getExtKeyUsageString();
if (!ku.includes("digitalSignature")) {
throw new Error("Недопустимое использование ключа для подписи");
}
if (ku.includes("keyCertSign")) {
console.log("Сертификат является удостоверяющим центром");
}
Библиотека использует ASN.1 парсер для извлечения расширений:
OID для Key Usage:
2.5.29.15
Внутренний алгоритм:
Такая практика обеспечивает корректное применение криптографических механизмов и предотвращает злоупотребления ключевым материалом.