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-verify 为 verify
声明了两个选项:[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]
我有一个 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-verify 为 verify
声明了两个选项:[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]