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

向Azure AD发送JWT断言时密钥未找到,如何解决?

解决Azure AD应用获取令牌时的AADSTS700027错误

错误原因

该错误明确指向签名客户端断言的证书未在Azure AD应用中注册,或你计算的证书指纹(x5t)与Azure后台存储的指纹不匹配。

问题排查与修复步骤

1. 修正证书指纹(x5t)计算逻辑

你的代码中x5t的计算方式有误,正确的x5t是对DER格式证书的SHA-1哈希二进制值做Base64URL编码,而非对十六进制哈希字符串编码。替换代码中的x5t计算语句:

原错误代码:

x5t="$(sha1sum ${PUBLIC_CERT_FILE} | awk '{print $1;}' | openssl base64 | sed s/\+/-/g |sed 's/\//_/g' |  sed -E s/=+$// )"

替换为:

x5t=$(openssl dgst -sha1 -binary ${PUBLIC_CERT_FILE} | openssl base64 | tr '+/' '-_' | tr -d '=')

2. 核对Azure应用中的证书信息

  • 登录Azure门户,进入目标应用注册页面,切换到证书和密码标签页。
  • 找到已上传的证书,复制其指纹(注意去掉指纹中的空格)。
  • 将复制的十六进制指纹转换为Base64URL编码,和你代码生成的x5t值对比,确保完全一致。

3. 修正证书转换步骤

确保从PFX提取证书和私钥的步骤正确,添加-nodes参数避免设置密码(脚本中无需交互输入密码):

# PFX转PEM(包含私钥和证书)
openssl pkcs12 -in <your-app>.pfx -out <your-app>.pem -nodes
# 提取公钥为DER格式
openssl x509 -in <your-app>.pem -outform der -out ${PUBLIC_CERT_FILE}
# 提取私钥
openssl rsa -in <your-app>.pem -out ${PRIVATE_KEY_FILE}

4. 修复JWT Payload中的错误

你的Payload里aud字段存在多余空格,导致受众URL无效,修正为:

"aud": "https://login.microsoftonline.com/${TENANT_ID}/oauth2/v2.0/token"

5. 验证客户端断言

生成CLIENT_ASSERTION后,用JWT解码工具检查:

  • x5t字段值是否和Azure证书指纹的Base64URL编码一致
  • exp和nbf时间戳是否在有效范围内(当前时间前后30分钟)
  • 签名是否有效(用公钥验证)

内容的提问来源于stack exchange,提问作者Steve Maring

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 07:25:18