我使用 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)
用于检查 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
由于 HAProxy ACL 语法的限制,您只能将样本(例如标头值)与文字(例如字符串)进行比较。
如果你必须做这样的比较,你可以使用Lua来比较任何你想要的东西。请参阅来自 HAProxy 社区的此帖子。
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
设置事务范围 (txn
) 变量,然后我们将其与客户端 id 标头与 strcmp
过滤器进行比较。
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