Azure Key Vault与OpenSSL RS256签名结果不一致问题求助
Azure Key Vault RS256签名与OpenSSL结果不一致的解决方法
核心问题
使用Azure Key Vault (AKV) REST API对SHA256哈希执行RS256签名后,AKV自身验证可通过,但用从AKV下载的PFX提取的私钥通过OpenSSL签名,结果与AKV返回的签名完全不同,需对齐两者的签名逻辑。
问题根源与解决方案
1. 签名格式差异:ASN.1包装区别
AKV的RS256签名直接对原始SHA256哈希二进制数据执行PKCS#1 v1.5格式的RSA签名,而OpenSSL的openssl dgst -sha256 -sign默认会在哈希值前添加ASN.1结构的摘要标识符(如SHA256对应的OID),导致签名结果不一致。
解决命令:使用openssl rsautl直接对原始哈希签名,跳过ASN.1包装:
echo -n $base64EncodedSHA256Digest | base64 -d | openssl rsautl -sign -inkey private.pem -raw | base64
其中-raw参数指定直接对输入二进制数据执行RSA签名,和AKV的RS256行为完全对齐。
2. PFX提取私钥的格式问题
从AKV下载的PFX可能包含证书链,提取私钥时需确保格式为PKCS#1标准格式(而非PKCS#8):
- 先提取私钥:
openssl pkcs12 -in your-cert.pfx -nocerts -out private.pem -nodes - 若私钥是PKCS#8格式(开头为
-----BEGIN PRIVATE KEY-----),转换为PKCS#1格式:openssl pkcs8 -in private.pem -out rsa-private.pem -traditional
使用转换后的rsa-private.pem执行签名命令。
3. 输入数据一致性校验
确保传给AKV的$base64EncodedSHA256Digest和传给OpenSSL的内容完全一致(无额外换行、空格),可通过以下命令验证:
echo -n $base64EncodedSHA256Digest | base64 -d | sha256sum
对比该结果与AKV签名时使用的哈希值的哈希,确保输入完全匹配。
4. 验证逻辑对齐测试
用OpenSSL验证AKV返回的签名,确认格式正确性:
- 从PFX提取公钥:
openssl pkcs12 -in your-cert.pfx -clcerts -nokeys -out cert.pem openssl x509 -in cert.pem -pubkey -noout -out public.pem - 验证AKV签名:
echo -n $base64EncodedSHA256Digest | base64 -d | openssl rsautl -verify -inkey public.pem -pubin -raw -signature <(echo $responseReturnedFromCallToSign | base64 -d)
若验证通过,说明AKV签名格式为原始RSA签名,调整OpenSSL签名命令即可匹配。
内容的提问来源于stack exchange,提问作者sam256
相关产品推荐
相关产品推荐

