X509証明書を解析するスクリプトを書いています。 x509 v3証明書には、OID、critical
フラグ、およびextnValue
と呼ばれるoctetStringを含むASN.1シーケンスである拡張があります。
basicConstraints
拡張子の場合、extnValueは詳細を含む別のASN.1シーケンスであると想定されます。
代わりに空のシーケンスを持つ証明書に遭遇しました。文字通りバイト0x30 0x00
これは、予想されるデータのセット(認証局のブール値とパス長の整数)の代わりに、長さがゼロのASN.1シーケンスに解析されます。
この品質の野生の証明書を見つけたという事実は、それがis有効であることを意味しますが、スクリプトがエラーをスローする代わりに正しく処理できるように、これに関する具体的なプロトコルルールを見つけたいと思っていました。
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: Not Present }
。
証明書はASN.1 DERエンコーディングを使用するため、DEFAULT
の値は指定しないでください。また、pathLenConstraint
をcA
に設定する場合はFALSE
を指定しないでください。したがって、30 00
は、「この証明書は認証局を表していない」ための唯一の有効な形式です。