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

Posted

技术标签:

【中文标题】如何使用 Apache mod_ssl 变量验证 URI 格式的主题备用名称的内容?【英文标题】:How Can I Verify the Contents of a Subject Alternate Name in URI Format Using Apache mod_ssl Variables? 【发布时间】:2019-07-21 10:01:31 【问题描述】:

我正在开发一个 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 不会提供对这种格式的 subjectAltNames 的访问" 可能是因为在网络上,99.9999999%(或多或少)的证书将仅使用 SAN 列表中的“DNS”类型。虽然存在其他类型,但它们更针对其他用途。它没有通过 mod_ssl 暴露的事实可能只是因为没有人需要它。您可能需要更新github.com/apache/httpd/blob/…,因为您可以清楚地看到没有考虑URI,以及其他一些地方并编译Apache。 或者不要在 Apache 级别执行此操作,而是在某些应用程序中执行(或通过过滤器或授权模块更接近 Apache),因为您至少可以访问完整证书作为 PEM 内容SSL_CLIENT_CERT 然后你“只”需要自己解析它。 嗨帕特里克,这也是我得到的一般印象。坦率地说,在这种情况下,我也从未见过用于 subjectAltName 的 URI 格式。幸运的是,我已经将 SSL_CLIENT_CERT 转发到我的应用程序层以进行一些额外的操作,因此您建议我在下游以编程方式处理它可能最终成为我最好/唯一的解决方案。我把这个问题留了一会儿,看看是否有任何额外的见解,以防万一。 【参考方案1】:

进一步查看 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)。

【讨论】:

以上是关于如何使用 Apache mod_ssl 变量验证 URI 格式的主题备用名称的内容?的主要内容,如果未能解决你的问题,请参考以下文章

特定用户的 Apache,mod_ssl“请求失败:读取标头时出错”

mod_ssl 2.8.31 是不是适用于 Apache 2.2?

如何在 Apache 2.2.9 中使用 mod_ssl 将 openssl 0.9.8 升级到 1.0.2

如何使用 mod_wsgi 从 django 访问 mod_ssl 环境变量?

linux Apache设置https访问以及加载mod_ssl.so模块以及问题解决

如何 out.println Apache JKEnvVar SSL_CLIENT_DN 从 mod_ssl 到 java、javascript 或 html?