具有由“通用”CA 签名的客户端证书身份验证的 haproxy

信息安全 tls 证书 相互的
2021-09-03 00:48:22

对不起,如果我在这里错误地发布了这个,我知道这个问题部分是关于 haproxy 本身的。

我正在将 haproxy 设置为我们需要通过 Internet 向客户公开的 API 前面的 SSL 终结器/负载平衡器。

该计划是使用相互(2 路)SSL/HTTPS 来验证双方的身份,因为 API 本身没有进一步的身份验证。除此之外,我们还将使用 IP 白名单。

现在客户给了我们一个双方都用于服务器和客户端证书的证书,这个证书是由一个“通用”CA (DigiCert) 签名的。虽然我理解从客户端的角度来看这很好,因为证书也与它正在访问的服务器的主机名进行比较,但是反过来似乎并不那么安全(至少不使用 haproxy)

按照我目前的理解,我必须告诉 HAProxy 使用“ca-file”指令信任由 Digicert 签名的证书,但是,没有办法告诉它除此之外它还需要是一个特定的客户端证书,因为我不想信任由 DigiCert 签名的所有客户端证书。

有没有办法用 HAProxy 做到这一点?如果不是,我想唯一的出路是为双方制作自签名的客户端证书并交换它们(或者更确切地说,证书签名请求,并让另一方签名)。

还是我对整个客户端证书概念的理解是错误的?

3个回答

基于 StackzOfZtuff 的回答,我发现实际上可以通过使用 acl 让 haproxy 自己执行此操作。

通过以下 2 行,我可以检查客户端证书中的 CN。并拒绝没有匹配 CN 的请求。

acl validcert ssl_c_s_dn(cn) -m str VALID\ CERT\ CN
http-request deny if !validcert

您可以读出证书的“通用名称”字段,然后将其传递到后端,如下所示:

http-request set-header X-SSL-Client-CN %{+Q}[ssl_c_s_dn(cn)]

然后,如果您将其与您自己颁发证书的 CA 结合起来,那么您可以在该字段中输入用户名。然后用 HAProxy 读出来。

此处描述:http: //blog.haproxy.com/2013/06/13/ssl-client-certificate-information-in-http-headers-and-logs/

我不熟悉 HAProxy,但我认为它不能配置为执行您的身份验证逻辑,这意味着在证书验证过程中只接受一些具有相同 CA 的证书。

有没有办法用 HAProxy 做到这一点?如果不是,我想唯一的出路是为双方制作自签名的客户端证书并交换它们(或者更确切地说,证书签名请求,并让另一方签名)。

您可以在此之上构建您的 CA,openssl而无需太多工作。您可能还需要授权客户端,因此您可以在客户端的证书主题中提供一些信息并在应用层检查它们。