HAProxy结合Azure应用注册实现Token验证:jwt_verify公钥配置疑问
关于HAProxy验证Microsoft Entra ID JWT签名的格式问题
问题概述
使用HAProxy过滤Microsoft Entra ID生成的JWT请求时,已完成算法、签发者、受众及过期时间的验证,但签名验证始终失败。尝试将从Entra ID发现密钥接口获取的x5c内容分别保存为PEM格式公钥和证书,均无法通过jwt_verify校验,需明确该指令要求的文件格式。
当前HAProxy配置
# 获取JWT负载部分字段 http-request set-var(txn.iss) http_auth_bearer,jwt_payload_query('$.iss') http-request set-var(txn.aud) http_auth_bearer,jwt_payload_query('$.aud') http-request set-var(txn.exp) http_auth_bearer,jwt_payload_query('$.exp','int') http-request set-var(txn.scope) http_auth_bearer,jwt_payload_query('$.scope') # JWT验证规则 acl algorithm var(txn.alg) -m str RS256 acl issuer var(txn.iss) -m str https://sts.windows.net/<tenant-id>/ acl audience var(txn.aud) -m str <audience> acl expired var(txn.exp),sub(txn.now) -m int lt 0 acl pbkey http_auth_bearer,jwt_verify(txn.alg,"/pubkey.pem") -m int 1
签名验证的正确格式要求
HAProxy的jwt_verify指令针对RS256算法时,必须使用PEM格式的RSA公钥文件,而非直接使用证书文件。正确的处理步骤如下:
- 从Entra ID发现密钥接口找到对应
kid的条目,提取x5c数组中的第一个证书内容,保存为临时证书文件(例如cert.pem),格式为:-----BEGIN CERTIFICATE----- MIIDlzC...(完整证书内容) -----END CERTIFICATE----- - 使用OpenSSL命令从证书中提取RSA公钥:
openssl x509 -pubkey -noout -in cert.pem > pubkey.pem - 生成的
pubkey.pem即为jwt_verify所需的文件,格式如下:-----BEGIN PUBLIC KEY----- MIIBIjANB...(完整公钥内容) -----END PUBLIC KEY-----
额外注意事项
- 确保HAProxy进程对
pubkey.pem文件拥有读权限 - 确认JWT头部的
alg字段确实为RS256,与配置中的算法校验一致 - 检查公钥文件路径是否正确,避免路径错误导致无法读取
内容的提问来源于stack exchange,提问作者Federico Crovetto
相关产品推荐
相关产品推荐

