对于具有名称约束的证书,OpenSSL 验证意外失败 "permitted subtree violation"

OpenSSL verify fails unexpectedly with "permitted subtree violation" for certificate with Name Constraints

我正在尝试使用包含名称约束扩展的证书来验证来自智能卡的 PIV 证书。如果我检查 -text 输出,一切看起来都应该没问题,但两个值的大小写不同。即使 rfc5280 表明它应该不区分大小写,OpenSSL 是否有可能进行区分大小写的比较?以下是相关的文本输出:

根 CA(将实际值更改为 example 但保留大小写:

            X509v3 Name Constraints: critical
                Permitted:
                  email:example.com
                  email:.example.com
                  DNS:example.com
                  DirName:C = US, O = Example

PIV 证书(同样,将实际值更改为示例)

       Subject: C = us, O = example, OU = people, CN = john.j.doe.123456

此处 Subject CO 值的大小写与 DirName 约束中的值不同。

这是我从 openssl verify

获得的完整输出
$ openssl verify -noCAfile -CAfile root.crt -untrusted intermediate.crt piv-cert.crt
C = us, O = example, OU = people, CN = john.j.doe.123456
error 47 at 0 depth lookup: permitted subtree violation
error piv-cert.crt: verification failed

不,这不是因为大小写; nc_dn in v3_ncons.c calls the i2d routine which calls x509_name_canon in x_name.c which calls asn1_string_canon 在比较之前删除不必要的空格并转换为小写。

它(可能,考虑到您的编辑)是由于额外检查叶证书中的 CommonName 如果它 'looks like' DNS 名称必须满足 DNS 约束,您的示例分别满足和不满足。

具体来说,NAME_CONSTRAINTS_check_CN in v3_ncons.c is called for the leaf/EE cert, and (now) calls cn2dnsid 检查 DNS 语法(post-punycoding 如果适用):所有 ASCII 字母、数字,加上非标准下划线,加上不在开头或结尾或连续的点(即所有 DNS 标签都必须是非空的)加上连字符不能在开头或结尾或与点相邻。如果通过,它将应用任何 DNS 限制。

这看起来像是用于 SSL/TLS 服务器证书 -- 并且提交 added an earlier version to 1.1.0 acknowledged 5280 doesn't call for CN check, while this refactoring for 1.1.1 briefly modified it to apply only if no SAN DNS was present (and thus checked), but immediately thereafter SAN 绕过已从代码中删除,同时文档被更改为将其描述为发生了,这对我来说是个错误——但代码并没有试图将其限制为此类服务器证书(并且可能不能,因为 EKU 是可选的)。