You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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公钥文件,而非直接使用证书文件。正确的处理步骤如下:

  1. 从Entra ID发现密钥接口找到对应kid的条目,提取x5c数组中的第一个证书内容,保存为临时证书文件(例如cert.pem),格式为:
    -----BEGIN CERTIFICATE-----
    MIIDlzC...(完整证书内容)
    -----END CERTIFICATE-----
    
  2. 使用OpenSSL命令从证书中提取RSA公钥:
    openssl x509 -pubkey -noout -in cert.pem > pubkey.pem
    
  3. 生成的pubkey.pem即为jwt_verify所需的文件,格式如下:
    -----BEGIN PUBLIC KEY-----
    MIIBIjANB...(完整公钥内容)
    -----END PUBLIC KEY-----
    

额外注意事项

  • 确保HAProxy进程对pubkey.pem文件拥有读权限
  • 确认JWT头部的alg字段确实为RS256,与配置中的算法校验一致
  • 检查公钥文件路径是否正确,避免路径错误导致无法读取

内容的提问来源于stack exchange,提问作者Federico Crovetto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 07:47:13