Я пишу скрипт, который разбирает сертификаты x509. Сертификаты x509 v3 имеют расширения, которые представляют собой последовательность ASN.1, содержащую OID, критический
флаг и строку octetString с именем extnValue
.
Для basicConstraints
extension, предполагается, что extnValue является другой последовательностью ASN.1 с подробностями.
Я обнаружил сертификат, в котором вместо этого была пустая последовательность. Буквально байты 0x30 0x00
, которые анализируют последовательность ASN.1 нулевой длины вместо ожидаемого набора данных (логическое значение для центра сертификации и целое число для длины пути.
Тот факт, что я нашел сертификат в дикой природе с таким качеством подразумевает, что он является действительным, но я надеялся найти конкретное правило протокола по этому поводу, чтобы мой сценарий мог обработать его правильно, а не выдавать ошибку.
extnValue
не пусто, это 30 00
, что является пустой последовательностью.
https://tools.ietf.org/html/rfc5280#section-4.2.1.9 говорит, что кодировка значения расширения Basic Constraints
BasicConstraints ::= SEQUENCE {
cA BOOLEAN DEFAULT FALSE,
pathLenConstraint INTEGER (0..MAX) OPTIONAL }
Поэтому пустая последовательность логически { cA : FALSE, pathLenConstraint: отсутствует }
.
Поскольку в сертификатах используется кодировка ASN.1 DER, никогда не следует указывать значение DEFAULT
, а в тексте говорится, что pathLenConstraint
никогда не следует указывать, когда cA
имеет значение FALSE
, поэтому 30 00
является единственно допустимой формой для «этот сертификат не представляет центр сертификации».