Apache需要了解客户端身份验证的中间证书吗?

时间:2014-04-29 21:02:48

标签: apache authentication ssl client-certificates

我有以下证书层次结构。我需要在Apache上进行客户端身份验证。

.
└── root (CA) - self signed
    ├── intermediate 1 (CA)
    |   ├── client1
    |   ├── client2
    └── intermediate 2 (CA)
        ├── client3
        └── client4

谁应该存储中间证书(客户端或服务器)?

我更愿意在服务器上只存储一个根CA,以验证所有客户端证书。主要原因是中间CA的列表可以增长,我不想更新存储在Apache配置中的所有时间证书。

这在技术上是否可行? SSL协议是否请求客户端发送整个链?

关于这个问题的一个想法。据我所知,当客户端对服务器进行身份验证时,服务器会将整个链路发送到客户端。我希望它是对称的,当服务器需要验证客户端时,客户有责任发送整个链。

1 个答案:

答案 0 :(得分:3)

总体规则是验证证书的实体应该能够在它给出的最终实体证书(EEC)和它已经信任的CA证书之间建立一个完整的证书链(或者它也可以信任一个特定的证书链。 EEC并直接比较,但这只是一个更具体和定制的案例。)

如果您是客户端,这适用于服务器证书验证,如果您是服务器,则适用于客户端证书验证。在这两种情况下,都会发送证书列表。事实上,关于邮件格式,Client Certificate section of the TLS specification主要是指Server Certificate section (7.4.2)

   Client certificates are sent using the Certificate structure
   defined in Section 7.4.2.

Meaning of this message:

   This message conveys the client's certificate chain to the server;

减少服务器信任的CA证书数量并不是一个坏主意。这将减少证书请求消息中公布的CA证书列表的大小,从而减小握手的大小。 (我已经看到默认部署,如果我记得很清楚,那么使用带有OSX密钥链中的默认信任库的Java服务器会导致该列表太大而客户端无法处理它。问题也会发生在Apache上Httpd服务器,如果配置了多个CA证书。)

期望客户提供完整的证书链并非没有道理。客户端工具通常能够执行此操作,尽管客户端证书可能需要针对预期的客户端进行相应的打包,如in this question in Java所述,或者使用PKCS#12文件构建,其链接依赖于此工具。为其用户部署PKI以使用客户端证书的人通常会意识到这一点,并相应地准备证书及其密钥(或向用户提供有关如何执行此操作的说明)。

如果您只是部署此服务器并依赖其他人来管理您所属的PKI,请与他们联系以确保他们向用户解释如何准备整个链(它与服务器链没有特别的不同) )。在许多情况下,您期望从客户端证书用户获得的证书技能可能与您在服务器上安装证书的系统管理员所期望的证书技能不同,因此有明确的解释,或者提前为此做好准备用户(特别是如果它在智能卡上)通常会有所帮助。

如果您也参与了PKI管理并亲自了解它,我还建议您尝试使用您期望的各种客户。也许尝试使用Wireshark查看流量(如果您使用初始协商,您将在初始握手中看到客户端证书链清除)以检查您的设置是否正确。

请注意,如果您关注传输的大小,您可以从链中排除根CA:发送它是没有意义的,因为远程方应该已经信任它(如果没有,它赢了无论如何,不​​要相信这个链条。 (请参阅TLS specification, Server Certificate section:“因为证书验证要求根密钥是独立分发的,所以可以在链中省略指定根证书颁发机构的自签名证书,前提是远程端必须已经拥有它以便在任何情况下验证它。“,也适用于客户证书列表,原因相同。)

另一点是,您原则上可以选择信任与您宣传的CA不同的一组CA(它只是“应该”:“如果证书请求消息中的certificate_authorities列表非空,则为证书链中的证书应该由列出的CA之一发布。“),Apache Httpd可以选择实现这一点,但我建议不要这样做:它通常只会增加混乱并提供很少或没有好处。