KJUR.asn1.x509.TBSCertificate представляет собой реализацию структуры To Be Signed Certificate (TBSCertificate) из стандарта X.509, используемого в инфраструктуре публичных ключей (PKI). В библиотеке Jsrsasign этот класс отвечает за формирование ASN.1-представления «подписываемой части» сертификата до применения цифровой подписи.
TBSCertificate является центральным компонентом X.509 сертификата и включает всю основную информацию: субъект, издателя, срок действия, открытый ключ и дополнительные расширения. Именно этот объект впоследствии сериализуется в ASN.1 DER и подписывается приватным ключом удостоверяющего центра.
Согласно RFC 5280, TBSCertificate имеет следующую логическую структуру:
В Jsrsasign эта структура моделируется через объектную модель ASN.1.
Класс создается с помощью:
new KJUR.asn1.x509.TBSCertificate(param)
Объект параметров может содержать следующие поля:
version — версия сертификата (0, 1, 2)serial — серийный номер в HEX или BigInteger
форматеsigalg — алгоритм подписи (например,
“SHA256withRSA”)issuer — Distinguished Name издателяnotbefore — начало действия сертификатаnotafter — окончание действия сертификатаsubject — Distinguished Name субъектаsbjpubkey — открытый ключ субъектаext — массив или объект расширений X.509Поля issuer и subject принимают структуру
DN:
{
str: "/C=RU/O=Example/CN=Test CA"
}
или расширенный формат:
{
array: [
{ type: "C", value: "RU" },
{ type: "O", value: "Example" },
{ type: "CN", value: "Test CA" }
]
}
Внутри Jsrsasign DN преобразуется в ASN.1 структуру RDNSequence.
Поле version кодируется следующим образом:
ASN.1 представление:
version [0] EXPLICIT Version DEFAULT v1
Version ::= INTEGER { v1(0), v2(1), v3(2) }
В TBSCertificate версия кодируется как контекстно-специфичное поле:
version: 2
Серийный номер кодируется как INTEGER и должен быть уникальным в пределах издателя.
Пример:
serial: "01a3f4b9"
или:
serial: 123456789
Jsrsasign автоматически преобразует значение в DER INTEGER.
Поле signature указывает алгоритм, которым будет
подписан сертификат:
Пример:
sigalg: "SHA256withRSA"
Важно, что TBSCertificate содержит только идентификатор алгоритма, сама подпись формируется после сериализации структуры.
Определяет временной интервал действия сертификата:
validity: {
notBefore: "230101000000Z",
notAfter: "240101000000Z"
}
Формат соответствует ASN.1 UTCTime или GeneralizedTime.
Внутри Jsrsasign поддерживаются строки в формате:
Содержит публичный ключ субъекта и его алгоритм.
Пример RSA:
sbjpubkey: {
alg: "RSA",
n: "00c1d3...",
e: "10001"
}
Пример ECDSA:
sbjpubkey: {
alg: "EC",
curve: "secp256r1",
pub: "04a1b2c3..."
}
В ASN.1 это соответствует структуре:
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING
}
Поле ext используется для X.509 v3 расширений:
Пример:
ext: [
{
extname: "basicConstraints",
cA: true,
critical: true
},
{
extname: "keyUsage",
digitalSignature: true,
keyCertSign: true
}
]
Поддерживаются стандартные расширения:
Каждое расширение кодируется как ASN.1 SEQUENCE.
Основная задача TBSCertificate — преобразование параметров в ASN.1 объект:
var tbs = new KJUR.asn1.x509.TBSCertificate({
version: 2,
serial: "01",
sigalg: "SHA256withRSA",
issuer: { str: "/C=RU/O=CA/CN=Root CA" },
notbefore: "240101000000Z",
notafter: "250101000000Z",
subject: { str: "/C=RU/O=Org/CN=User" },
sbjpubkey: {
alg: "RSA",
n: "...",
e: "10001"
}
});
После создания объект может быть сериализован:
var asn1 = tbs.toASN1Object();
var der = asn1.getEncodedHex();
Ключевой метод класса:
TBSCertificate.prototype.toASN1Object = function()
Он возвращает ASN.1 структуру:
TBSCertificate не используется изолированно. Он является частью полной цепочки:
Пример интеграции:
var x = new KJUR.asn1.x509.Certificate({
tbsobj: tbs,
prvkey: privateKey
});
TBSCertificate не формирует байты напрямую, а использует:
Строковые DN автоматически парсятся в RDNSequence.
Неверный формат notBefore / notAfter
приводит к ошибке ASN.1 кодирования.
Если sigalg не соответствует типу ключа, сертификат
становится невалидным.
Минимально необходимы:
TBSCertificate — это именно та часть сертификата, которая подписывается центром сертификации. Любое изменение хотя бы одного байта:
TBSCertificate ::= SEQUENCE {
version [0] EXPLICIT INTEGER,
serialNumber INTEGER,
signature AlgorithmIdentifier,
issuer Name,
validity Validity,
subject Name,
subjectPublicKeyInfo SubjectPublicKeyInfo,
extensions [3] EXPLICIT Extensions OPTIONAL
}