使用 haproxy 捕获和转发扩展的 PKI 证书属性(例如 UPN)

使用 haproxy 捕获和转发扩展的 PKI 证书属性(例如 UPN)

我正在尝试在相互身份验证场景中从客户端证书中提取属性,并将其设置为对后端的请求中的 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 标头来读取整个客户端证书。

相关内容