【问题标题】:HAProxy SSL Termination - Client certificate Extended Key usage extension validationHAProxy SSL 终止 - 客户端证书扩展密钥使用扩展验证
【发布时间】:2018-02-23 20:07:30
【问题描述】:

我们正在使用 HAProxy (v1.6.9) 来验证客户端证书 (X.509 v3) 并执行 SSL 终止。我们要验证客户端证书中的扩展密钥用法和基本约束扩展。通过查看 HAProxy 源代码和 OpenSSL verify 文档,我猜 keyUsage 扩展将得到验证。但是,它是否对扩展密钥用法以及基本约束扩展进行验证?如果没有,那有没有办法在请求头中设置这个信息,然后转发给应用,让应用验证呢?

根据我对 OpenSSL 文档的理解,我们需要在 verify 中设置“目的”选项来验证这些扩展,但我在 HAProxy 的源代码中找不到该选项。如果我错了,请纠正我。

谢谢。

【问题讨论】:

    标签: ssl haproxy x509 client-certificates


    【解决方案1】:

    当您使用命令行verify 或调用X509_verify_cert 时,如果您想要检查它,您确实需要指定“用途”,因为这些操作可以处理用于任何用途(或用途组合)的证书链。对于 SSL/TLS 协议,这是自动处理的,因为 libssl 代码知道它已收到并正在检查“SSL”(包括 TLS)服务器或客户端的证书/链;参见function ssl_validate_cert_chain in ssl/ssl_cert.c——这一行具有指定“目的”的效果。仅对于 1.1.0 版(到目前为止),还针对锚点/根的可选本地信任属性检查目的(除了 ExtendedKeyUsage 扩展)。

    手册页上的声明“如果不包含 - purpose 选项,则不检查 [不受信任的证书扩展]”。可能会产生误导。如果未指定目的,则不会进行目的检查,但无论目的如何,总是会进行一些扩展检查——至少总是针对具有不同于 EE 证书的 CA 证书的正确链;对于自签名 EE 证书,它充当自己的锚并实际上是自己的 CA,一些检查是不适用的。

    特别是,如前几段所述,在构建阶段 CA(又名颁发者)证书会检查 KeyUsage.certSign 和 SKI/颁发者/序列匹配 AKI。在第二阶段,检查所有不受信任的证书的 BasicConstraints(以及现在很少见的 NetscapeCertType)和 KeyUsage.certSign(再次)和 NameConstraints(自 1.0.0 起),如果配置了对等 id,则匹配 EE SAN 或主题(这通常仅在对等方是服务器时才有意义,因此不是您的情况,并且仅从 1.0.2 开始);如果已配置(不是默认设置),还会进行吊销检查(可能涉及扩展);如果在所有不受信任的证书上除了 ExtKeyUsage 之外还配置了目的检查(用于 libssl),它会检查 EE 证书的 KeyUsage 和 NetscapeCertType。虽然这里的 EE KeyUsage 检查不是特定于密码套件,因此协商的密钥交换方法;在 libssl 中单独检查。

    除了检查签名和有效期(如上所述)之外,最后阶段还会检查 RFC3779 扩展是否已使用(几乎从不?)以及是否已配置(可能很少见)CertificatePolicies 以及 PolicyMappings、PolicyConstraints 和 InhibitAnyPolicy。

    请注意,仅当扩展名的值不一致时,扩展检查才会失败;如果给定证书中(由 CA)省略了扩展,则它实际上允许与该扩展相关的所有内容。

    HTH。

    【讨论】:

    • 感谢 dave_thompson_085 的详细解释。这绝对有帮助。我们正在使用 libssl 1.0.0。因此,根据我的理解,ExtendedKeyUsage 和 Basic 约束扩展都将作为 SSL/TLS 连接的一部分进行验证。我说的对吗?
    猜你喜欢
    • 2015-08-07
    • 1970-01-01
    • 2014-06-25
    • 2021-02-10
    • 1970-01-01
    • 2014-06-08
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多