我使用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)
字符串
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
rur96b6h2#
由于HAProxy ACL语法的限制,您只能将样本(例如,标头值)与文字(例如,字符串)进行比较。如果你必须做这样的比较,你可以使用Lua进行任何你想要的比较。参见this thread from HAProxy community。
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:
set-var-fmt
txn
client_cn
strcmp
set-var
http-request set-var(txn.client_cn) ssl_c_s_dn(cn)
型如果你只打算在请求处理中使用变量,你可以使用req作用域(仅在请求处理期间可用):
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而不是hdr。hdr假设值像Accept-Language一样以逗号分隔,并且可能导致意外行为。它返回最后一个逗号分隔的值。
req.fhdr
hdr
3条答案
按热度按时间xu3bshqb1#
检查CN并允许基于列表进行身份验证的示例配置:
字符串
rur96b6h2#
由于HAProxy ACL语法的限制,您只能将样本(例如,标头值)与文字(例如,字符串)进行比较。
如果你必须做这样的比较,你可以使用Lua进行任何你想要的比较。参见this thread from HAProxy community。
a14dhokn3#
字符串
它使用
set-var-fmt
创建了一个新的transaction-scoped(txn
)变量,我将其命名为client_cn
,然后使用strcmp
过滤器将其与client-id头进行比较。如果你不需要使用格式字符串,你可以使用
set-var
:型
如果你只打算在请求处理中使用变量,你可以使用
req
作用域(仅在请求处理期间可用):型
注意我使用了
req.fhdr
而不是hdr
。hdr
假设值像Accept-Language一样以逗号分隔,并且可能导致意外行为。它返回最后一个逗号分隔的值。