В ASN.1 (Abstract Syntax Notation One) временные типы используются для кодирования дат и времени в криптографических структурах, сертификатах X.509, запросах PKCS и других протоколах. Основная задача этих типов — обеспечить однозначное и стандартизированное представление времени, независимое от локальных настроек системы.
В экосистеме JavaScript-библиотеки Jsrsasign работа с временными значениями встречается при обработке:
notBefore и
notAfter)В ASN.1 определены два основных временных типа:
Они используются в зависимости от диапазона дат и требований стандарта.
UTCTime представляет дату и время в сокращённом формате:
YYMMDDHHMMSSZ
или с указанием смещения:
YYMMDDHHMMSS+hhmm
YYMMDDHHMMSS-hhmm
Ключевая особенность — двухзначный год (YY), что требует
правил интерпретации.
В криптографических стандартах применяется следующее правило:
Таким образом:
240101000000Z → 1 января 2024 года991231235959Z → 31 декабря 1999 годаUTCTime применяется только для диапазона:
Это ограничение делает его устаревающим в современных системах, но он всё ещё широко используется в сертификатах ради совместимости.
GeneralizedTime использует четырёхзначный год:
YYYYMMDDHHMMSSZ
или с дробными секундами:
YYYYMMDDHHMMSS.fffZ
Также допускаются временные зоны:
YYYYMMDDHHMMSS+hhmm
YYYYMMDDHHMMSS-hhmm
Пример:
20260101123045Z → 1 января 2026, 12:30:45 UTC20351231235959.123Z → 31 декабря 2035 с
миллисекундамиВ X.509 сертификате временные поля обычно представлены как:
Validity ::= SEQUENCE {
notBefore Time,
notAfter Time
}
где Time определяется как:
Time ::= CHOICE {
utcTime UTCTime,
generalTime GeneralizedTime
}
Библиотека Jsrsasign предоставляет классы и функции для кодирования и декодирования ASN.1 временных типов.
Основные классы:
KJUR.asn1.DERUTCTimeKJUR.asn1.DERGeneralizedTimeX509 и ASN1HEXconst { KJUR } = require("jsrsasign");
const utc = new KJUR.asn1.DERUTCTime({
date: "240101120000Z"
});
const hex = utc.getEncodedHex();
Здесь дата задаётся в строковом формате ASN.1.
Альтернативный способ через JavaScript Date:
const utc = new KJUR.asn1.DERUTCTime({
date: new Date(Date.UTC(2024, 0, 1, 12, 0, 0))
});
const gen = new KJUR.asn1.DERGeneralizedTime({
date: "20260101123045Z"
});
const hex = gen.getEncodedHex();
С использованием объекта Date:
const gen = new KJUR.asn1.DERGeneralizedTime({
date: new Date(Date.UTC(2026, 0, 1, 12, 30, 45))
});
При анализе X.509 сертификата Jsrsasign автоматически определяет тип времени.
const x509 = new KJUR.crypto.X509();
x509.readCertPEM(certPem);
const notBefore = x509.getNotBefore();
const notAfter = x509.getNotAfter();
Результат возвращается в виде строки, приведённой к стандартному JavaScript Date-подобному формату.
При низкоуровневом анализе используется ASN1HEX.
const hex = KJUR.asn1.ASN1Util.newObject({
utcTime: { str: "240101000000Z" }
}).getEncodedHex();
const parsed = KJUR.asn1.ASN1Util.getTimeHex(hex);
Jsrsasign при конвертации времени опирается на стандарт UTC.
Важно учитывать:
Z для UTCПри интеграции с внешними системами встречаются ошибки:
Некоторые библиотеки могут трактовать 49 как 1949 вместо
2049.
Если отсутствует Z, некоторые реализации интерпретируют
время как локальное.
GeneralizedTime с миллисекундами может быть усечён при передаче через старые системы.
В Jsrsasign можно вручную преобразовать один формат в другой:
const utcStr = "240101120000Z";
const date = KJUR.asn1.DERUTCTime.prototype.getDate.call({
getTime: () => utcStr
});
const gen = new KJUR.asn1.DERGeneralizedTime({
date: date
});
Хотя JWT не использует ASN.1 напрямую, при генерации подписи временные метки часто синхронизируются с ASN.1 сертификатами.
В CRL время отзыва всегда кодируется как UTCTime или GeneralizedTime в зависимости от версии стандарта.
Если входная строка времени некорректна:
ZJsrsasign может:
UTCTime и GeneralizedTime являются фундаментальными элементами криптографических протоколов, обеспечивая:
В Jsrsasign эти типы реализуют мост между ASN.1 структурой и JavaScript-объектами даты, сохраняя совместимость с X.509 и PKI инфраструктурой.