向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
相关产品推荐
相关产品推荐

