HAProxy:未经验证无法在 header 中转发 client-certificate

HAProxy: unable to forward client-certificate in a header without validation

我有一个 mutual-TLS 设置,HAProxy 终止传入的 SSL 连接。我需要在后端执行客户端证书验证,而不是在 haproxy 端,因为我们有一个动态信任库,我不能只设置一个 ca-file 并将所有验证逻辑委托给 haproxy。 常规设置工作正常(其中 haproxy 根据 CA 证书验证客户端证书):

bind *:443 ssl crt /etc/certs/haproxy.pem verify required ca-file /etc/certs/ca.crt
http-request redirect scheme https unless { ssl_fc }
http-request set-header X-SSL-ClientCert          %{+Q}[ssl_c_der,base64]

后端正确接收X-SSL-ClientCert,但这还不够。 如果删除verify required ca-file /etc/certs/ca.crt以跳过haproxy的验证,在后端读取时X-SSL-ClientCert为空,即HAProxy不再设置header与客户端证书。关于如何解决这个问题有什么想法吗?

好吧,经过一些修补,我偶然发现了以下内容:

HAProxy 文档 https://cbonte.github.io/haproxy-dconv/2.3/configuration.html#5.2-verifyverify 声明了两个选项:[none|required],但似乎有一个未记录的选项,即 optional 似乎可以解决问题:

bind *:443 ssl crt /etc/certs/haproxy.pem verify optional ca-file /etc/certs/ca.crt
http-request set-header X-SSL-Client-Cert          %{+Q}[ssl_c_der,base64]
http-request set-header X-SSL-Client-CN            %{+Q}[ssl_c_s_dn(cn)]
http-request set-header X-SSL-Client-Verify        %[ssl_c_verify]

你的想法是对的。

另一方面,我认为有一个更具可读性的写作。

在你的 /etc/hapee/hapee-lb.cfg

bind :443 ssl crt-list /etc/hapee/certs-file

在你的/etc/hapee/certs-file

cert_example1.pem [verify optional ca-file /etc/hapee/certs/ca.crt]
cert_example2.pem

因此您可以根据您的 SNI 轻松列出所有证书和可能的验证选项。

匹配的后端

backend
        http-request set-header X-SSL-Client-DN            %[ssl_c_s_dn]
        http-request set-header X-SSL-Client-Cert          %{+Q}[ssl_c_der,base64]
        http-request set-header X-SSL-Client-CN            %{+Q}[ssl_c_s_dn(cn)]
        http-request set-header X-SSL-Client-Verify        %[ssl_c_verify]