我正在尝试在相互身份验证场景中从客户端证书中提取属性,并将其设置为对后端的请求中的 HTTP 标头。见fig 1
下文。
图。1 [具有正确证书的用户] | | 1. 出示具有正常 v1 属性的证书 | 有额外的“扩展”属性 | 包括“主题替代名称”,其中包含 | “用户主体名称”(UPN 看起来像电子邮件地址) | [example.com:443 haproxy] --app1 / app2 CNAME 到 example.com | | 2. 读取主题备用名称 | 3. 正则表达式或解析出 UPN | 4. 将 REMOTE_USER 标头设置为 UPN | 5. 传递至后端 | ┌------------------┬ | | | | | | | | 维拉 [应用程序1服务器:80] [应用程序2服务器:80]
通常,这很容易,您只需使用内置功能提取所需的属性,如下所示:
前端 https 绑定 *:443 名称 https ssl crt ./server.pem ca-file ./ca.crt 验证要求 http 请求设置标头 X-SSL-Client-DN %{+Q}[ssl_c_s_dn] http 请求设置标头 X-SSL-Client-CN %{+Q}[ssl_c_s_dn(cn)] http 请求设置标头 X-SSL-Issuer %{+Q}[ssl_c_i_dn] http 请求设置标头 X-SSL-Client-NotBefore %{+Q}[ssl_c_notbefore] http 请求设置标头 X-SSL-Client-NotAfter %{+Q}[ssl_c_notafter] 默认后端 app1svr 后端app1svr 服务器应用程序1 app1svr.example.com:80 后端app2svr 服务器 app2 app2svr.example.com:80
此处的属性列表:https://cbonte.github.io/haproxy-dconv/configuration-1.5.html#7.3.4
不幸的是,属性列表中缺少任何 COMMON 扩展属性,例如:
- 主题备用名称
- RFC822 名称
- 其他名字
- 校长姓名
- CRL 分发点
我似乎无法找到访问这些属性的正确方法。查看代码(第 5815 行以下)https://github.com/haproxy/haproxy/blob/master/src/ssl_sock.c似乎不是只是文档问题。
有什么想法吗?(可能相关的问题):https://stackoverflow.com/questions/22966461/reading-an-othername-value-from-a-subjectaltname-certificate-extension
答案1
HAProxy 版本 1.5.14(参见http://www.haproxy.org/news.html)HAProxy 在 ssl_c_der 属性中发送整个证书。
因此,如果你在 haproxy 配置文件中放入以下几行
http-request set-header X-SSL-ClientCert-Base64 %{+Q}[ssl_c_der,base64]
然后您可以通过读取 X-SSL-ClientCert-Base64 标头来读取整个客户端证书。