ssl 用于比较标头中的值的HaProxy ACL

332nm8kg  于 5个月前  发布在  HAProxy
关注(0)|答案(3)|浏览(51)

我使用Haproxy作为SSL终端来识别客户端证书。我想检查客户端证书中的CN值是否与客户端发送的标头值匹配。如果证书中的CN值与标头中的值不匹配,是否有方法设置ACL?
类似于:

http-request set-header X-SSL-Client-CN     %{+Q}[ssl_c_s_dn(cn)]
acl id_not_match hdr(client-id) -m hdr(X-SSL-Client-CN)

字符串

xu3bshqb

xu3bshqb1#

检查CN并允许基于列表进行身份验证的示例配置:

frontend www-https
   ....
   http-request set-header X-SSL-Client-CN             %{+Q}[ssl_c_s_dn(cn)]
   use_backend www-backend
backend www-backend
   acl allow_users req.fhdr(X-SSL-Client-CN) -m str -f /etc/haproxy/ssl/userslist
   http-request deny if !allow_users
   ....
   server www-1 <ip>:<port> check
   server www-2 <ip>:<port> check

字符串

rur96b6h

rur96b6h2#

由于HAProxy ACL语法的限制,您只能将样本(例如,标头值)与文字(例如,字符串)进行比较。
如果你必须做这样的比较,你可以使用Lua进行任何你想要的比较。参见this thread from HAProxy community

a14dhokn

a14dhokn3#

http-request set-var-fmt(txn.client_cn) %{+Q}[ssl_c_s_dn(cn)]
acl id_not_match req.fhdr(client-id),strcmp(txn.client_cn) eq 0

字符串
它使用set-var-fmt创建了一个新的transaction-scoped(txn)变量,我将其命名为client_cn,然后使用strcmp过滤器将其与client-id头进行比较。
如果你不需要使用格式字符串,你可以使用set-var

http-request set-var(txn.client_cn) ssl_c_s_dn(cn)


如果你只打算在请求处理中使用变量,你可以使用req作用域(仅在请求处理期间可用):

http-request set-var(req.client_cn) ssl_c_s_dn(cn)
acl id_not_match req.fhdr(client-id),strcmp(req.client_cn) eq 0


注意我使用了req.fhdr而不是hdrhdr假设值像Accept-Language一样以逗号分隔,并且可能导致意外行为。它返回最后一个逗号分隔的值。

相关问题