我正在编写一个解析 x509 证书的脚本。x509 v3 证书具有扩展,它是包含 OID、标志critical
和八位字节串的ASN.1 序列extnValue
。
对于basicConstraints
扩展,extnValue 应该是另一个带有详细信息的 ASN.1 序列。
我遇到过一个证书,它有一个空序列。字面上的字节0x30 0x00
解析为长度为零的 ASN.1 序列,而不是预期的数据集(证书颁发机构的布尔值和路径长度的整数)。
事实上,我发现了一个具有这种质量的证书,这意味着它是有效,但我希望找到有关此问题的具体协议规则,以便我的脚本可以正确处理它而不是引发错误。
答案1
extnValue
不是空的,它是30 00
,这是一个空序列。
https://www.rfc-editor.org/rfc/rfc5280#section-4.2.1.9说基本约束扩展值的编码是
BasicConstraints ::= SEQUENCE {
cA BOOLEAN DEFAULT FALSE,
pathLenConstraint INTEGER (0..MAX) OPTIONAL }
因此,空序列在逻辑上是{ cA: FALSE, pathLenConstraint: Not Present }
。
由于证书使用 ASN.1 DER 编码,因此DEFAULT
永远不应指定值,并且文本表示当设置为时pathLenConstraint
永远不应指定,因此是“此证书不代表证书颁发机构”的唯一有效形式。cA
FALSE
30 00