如何使用 Apache mod_ssl 变量验证 URI 格式的主题备用名称的内容?

How Can I Verify the Contents of a Subject Alternate Name in URI Format Using Apache mod_ssl Variables?

我正在从事一个 Web 服务项目,该项目要求连接到我的服务的客户端通过 X.509 证书对自己进行身份验证,作为相互身份验证 TLS 协商的一部分。除了将客户端证书链接到特定的 PKI 信任链之外,我的要求还规定我必须验证证书中的特定值。具体来说,主题 DN 必须包含一个具有预定值的 OU,证书必须包含一个具有不同预定值的 URI 格式的 subjectAltName。

我在 CentOS 7 系统上使用 Apache httpd 2.4.6,并且能够通过利用常见 mod_ssl 变量的标准 Apache 配置指令相当轻松地满足大多数这些要求,但有一个明显的例外:我似乎无法找到允许我访问 URI 格式的 subjectAltName 值的变量。查看此处找到的 mod_ssl 文档:

https://httpd.apache.org/docs/2.4/mod/mod_ssl.html

我可以看到以下 subjectAltName 格式的变量:

SSL_CLIENT_SAN_Email_n - rfc822Name

类型的客户端证书的 subjectAltName 扩展条目

SSL_CLIENT_SAN_DNS_n - 客户端证书的 dNSName

类型的 subjectAltName 扩展条目

SSL_CLIENT_SAN_OTHER_msUPN_n - otherName 类型的客户端证书的 subjectAltName 扩展条目,Microsoft 用户主体名称形式 (OID 1.3.6.1.4.1.311.20.2.3)

鉴于 URI 是 RFC 5280 (X.509/PKI) 第 4.2.1.6 节中定义的 subjectAltName 值的独特且有效格式,我不知道为什么 mod_ssl 不提供以这种格式访问 subjectAltNames。是否有一个变量提供了我在文档中根本没有看到的这个功能?

进一步查看 mod_ssl 源代码,很明显,目前根本不支持以 URI 格式提取 SAN 值以用于变量,如评论所述:

        /*
         * Not implemented right now:
         * GEN_X400 (x400Address)
         * GEN_DIRNAME (directoryName)
         * GEN_EDIPARTY (ediPartyName)
         * GEN_URI (uniformResourceIdentifier)
         * GEN_IPADD (iPAddress)
         * GEN_RID (registeredID)
         */

https://github.com/apache/httpd/blob/5f32ea94af5f1e7ea68d6fca58f0ac2478cc18c5/modules/ssl/ssl_util_ssl.c

因此,我的问题的答案显然是目前没有我可以用于此目的的变量,并且满足此要求将需要一个解决方法(或将 GEN_URI 的实现推送到 mod_ssl).