【问题标题】:Does Apache needs to know about intermediate certificates for client authentication? [closed]Apache 是否需要了解客户端身份验证的中间证书? [关闭]
【发布时间】:2014-04-29 21:02:47
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 投票迁移到 ServerFault。
  • @Bruno 您投票决定关闭而不是移动(这就是列表中该项目的工作方式)。列表中有一个不同的项目实际上会移动 - 之前上一级的项目。
  • @EugeneMayevski'EldoSCorp 啊,奇怪,我很确定我选择了“Off Topic”,然后选择了“Server Fault”。我没有注意到任何其他移动选项。

标签: apache authentication ssl client-certificates


【解决方案1】:

总体规则是,验证证书的实体应该能够在其提供的最终实体证书 (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 查看流量(如果您使用 initial 协商,您会在初始握手中看到客户端证书链清晰)来检查您的设置是否正确。

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

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

【讨论】:

  • 布鲁诺,感谢您的回答。你介意吗,如果我在 SO 之外联系你。我有几个后续问题,不太适合 SO。您的个人资料没有任何信息,如果您不介意,可以给我发一封电子邮件(我的个人资料中有)。
猜你喜欢
  • 2022-06-23
  • 2012-11-08
  • 2018-10-20
  • 2013-04-05
  • 1970-01-01
  • 2011-04-09
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多