我在 Alpine Docker 容器中运行 haproxy。它正在为 https 执行 SSL 终止并将客户端 DN 注入 X-ForwardedFor HTTP 标头。但它对客户端 DN 使用的格式不是我的应用程序支持的格式。
我可以以某种方式更改格式吗,例如使用 openssl.cnf?人们显然以这种方式更改加密算法设置。我也可以更改我的 DN 格式吗?
这是我需要在 X-ForwardedFor 标头中显示的证书 DN 格式。它相当符合 LDAP 规范。
CN=Jane Smith,OU=org1,OU=org2,O=myorg,C=AU
但是 haproxy 注入的是一种类似 ASN.1 的格式
/C=AU/O=myorg/OU=org2/OU=org1/CN=Jane Smith
这些是软件的版本。它们可以更改,因为我正在从源代码编译 haproxy。我还可以在编译时设置任何标志:
- Haproxy 2.0
- Alpine 3.10
- openssl 1.1.1
以下是我认为的 haproxy.cfg 文件的相关部分。
frontend fe
mode http
bind *:443 ssl no-sslv3 no-tls10 no-tlsv11 crt /certs/mycert ca-file /certs/myca
option forwardfor
http-request set-header X-ForwardedFor %{+Q+E}[ssl_c_s_dn]
default_backend be
backend be
balance source
mode http
server server1 IP:PORT ca-file /certs/myca crt /certs/mycert ssl verify none
我可以做些什么来改变格式?我尝试使用这样的记录结构:%{+Q+E}[ssl_c_s_dn(CN)],但我的证书 DN 的格式非常混乱。无法预测可能有多少个 OU、C、O 等,有时它们会丢失。所以我认为这不是一个可行的解决方案。
我也研究过这个问题:haproxy tls哈希算法使用 openssl 设置自定义 haproxy 行为。我可以这样做来将 DN 转换为不同的格式吗?如果可以,怎么做?我不确定要遵循哪些步骤。我需要在编译时修改 openssl.cnf,还是在服务器上运行时更改它?哪些部分和值?
答案1
看起来您已成功将补丁合并到 HAProxy[1] 中,并且该补丁将在 2.2 版本发布时发布。
从 2.2 文档[2] 来看,用法如下
frontend fe
mode http
bind *:443 ssl no-sslv3 no-tls10 no-tlsv11 crt /certs/mycert ca-file /certs/myca
option forwardfor
http-request set-header X-ForwardedFor %{+Q+E}[ssl_c_s_dn(,0,rfc2253)]
default_backend be
backend be
balance source
mode http
server server1 IP:PORT ca-file /certs/myca crt /certs/mycert ssl verify non
[1]https://git.haproxy.org/?p=haproxy.git;a=commit;h=71f829767d3a5f8e2f309862b1e606bb03323878
[2]http://cbonte.github.io/haproxy-dconv/2.2/configuration.html#7.3.4-ssl_c_s_dn