X.509 客户端身份验证的 Apache + mod_ssl 中间 CA 自动发现

Posted

技术标签:

【中文标题】X.509 客户端身份验证的 Apache + mod_ssl 中间 CA 自动发现【英文标题】:Apache + mod_ssl intermediate CA auto discovery for X.509 client auth 【发布时间】:2014-04-14 11:31:50 【问题描述】:

是否可以(...补丁、模块、任何东西...)配置 apache/mod_ssl 网络服务器(任何版本)以自动发现/下载中间颁发 CA 证书到预定义的信任根 CA?

我们需要能够为数以万计的最终用户提供 TLS 客户端身份验证,并且可能需要网络服务器信任数百个中间颁发 CA。我们可以访问Axway/Tumbleweed Server Validator 来处理链中证书的 SCVP/OCSP/CRL 验证(吊销、OID 策略等),但是为了让 Axway 服务器验证器插件通过客户端证书,apache/ mod_ssl 必须首先对客户端证书进行身份验证/验证,并且它针对预先配置的 apache CA 证书数据库(带有 PEM 编码 CA 证书的串联列表的文本文件或包含单个证书文件的目录)颁发链。

无论 apache 是否知道颁发 CA 链(因为 SCVP 将为我验证该链),我都可以接受任何证书,但我找不到任何表明这是可能的信息。

我可以手动(或通过脚本)创建 CA 证书捆绑文本文件,但我确信这将很快成为一个非常大的文件,并且需要定期扫描以删除过期的 CA 证书并添加新颁发的证书。当然,这种方法的问题是,当新的 CA 证书添加到捆绑文件/目录时,需要重新启动网络服务器,并且生成的文件可能有几兆字节大小,这对网络服务器的性能不利.

非常感谢任何帮助和/或想法。

【问题讨论】:

【参考方案1】:

您可能对this question 感兴趣。 但是,除非您真正了解自己在做什么,否则这很可能会引入安全漏洞。

这样做有两个问题:

    SSLVerifyCLient optional_no_ca 将允许任何客户端证书通过。您唯一可以确定的是客户端具有与他们提供的证书中的公钥匹配的私钥(证书可能还需要当前有效并且使用 TLS 客户端密钥,我不能记住)。

    SSLCADNRequestFile 指向一个空文件(或只是一个换行符)也会使服务器向其客户端通告一个空的 CA 列表。请注意,这是 TLS 1.0 之前的未记录行为(但通常有效)并从 TLS 1.1 开始授权,但作为“未指定”行为。

第一点是个问题,因为您根本没有在 Apache Httpd 中验证证书。如果后面的应用程序(依赖于身份验证)作为其身份验证层的一部分(您以受信任的方式将客户端证书链转发到该层)执行某些操作,可以。对于 Apache Httpd 层本身的任何东西,这绝对是不行的:Httpd 中的任何限制都会使用像 SSL_CLIENT_S_DNFakeBasicAuth 这样的表达式,只是 不能 被依赖。

第二点可能是可用性方面的问题,因为它可能会混淆许多客户端,特别是具有多个可用证书并且通常根据服务器通告的 CA 执行自动选择的客户端。

更一般地说,“成千上万的最终用户”具有如此多种中间 CA 的情况似乎不寻常。在传统的 PKI 模型中,您配置的 CA 是您信任的锚点:它们的存在是有原因的,并且您信任它们。真正应该由客户端来提供所需的中间证书(或者由服务器来信任它们并明确地宣传它们)。虽然您尝试做的事情在技术上可能是可行的,但您在实施时需要非常小心。也不清楚这在多大程度上符合各种管理标准和政策。

【讨论】:

以上是关于X.509 客户端身份验证的 Apache + mod_ssl 中间 CA 自动发现的主要内容,如果未能解决你的问题,请参考以下文章

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

让 Grails、Spring Security Core Plugin 和 Tomcat 使用 X.509 证书身份验证

[信息安全] 05 X.509 公钥证书的格式标准

读取 X.509 密钥或证书文件时出错:解析时出错

客户端证书身份验证和用户注册

如何使用 WCF 签署 X509 令牌