如何获取.cer证书符合Azure AD客户端断言要求的签名值
解决方案
你之前用openssl输出的是格式化的人类可读十六进制文本,并非Azure要求的URL安全Base64编码格式,按以下步骤操作即可拿到符合要求的签名:
核心转换逻辑
你拿到的冒号分隔十六进制签名只需要两步转换:
- 先删除十六进制字符串中的所有冒号、空格、换行,得到连续纯十六进制串
- 将十六进制串转为URL安全的Base64编码(即JWT兼容编码,规则:普通Base64编码后将
+替换为-、/替换为_,删除末尾所有=填充字符)
Linux/macOS 一步执行命令
openssl x509 -inform der -in "path\Certiftest.cer" -noout -text \ | grep -A 100 "Signature Algorithm: sha256WithRSAEncryption" \ | tail -n +2 \ | tr -d ':\n ' \ | xxd -r -p \ | base64 \ | tr '+/' '-_' \ | tr -d '='
Windows PowerShell 一步执行命令
# 提取纯十六进制签名 $sigHex = (openssl x509 -inform der -in "path\Certiftest.cer" -noout -text | Select-String -Pattern "Signature Algorithm: sha256WithRSAEncryption" -Context 0,20 | ForEach-Object { $_.Context.PostContext } | Out-String) -replace '[^0-9a-fA-F]','' # 十六进制转二进制 $sigBytes = [byte[]]::new($sigHex.Length / 2) for($i=0; $i -lt $sigHex.Length; $i+=2) { $sigBytes[$i/2] = [Convert]::ToByte($sigHex.Substring($i,2), 16) } # 转URL安全Base64编码 $sigBase64 = [Convert]::ToBase64String($sigBytes) -replace '\+','-' -replace '/','_' -replace '=+$','' # 输出结果 $sigBase64
执行后输出的字符串即可匹配Azure官方文档的示例格式。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

