使用Azure Key Vault的EC密钥执行ES256签名请求遇400错误
解决Azure Key Vault EC密钥签名请求的400错误问题
问题核心
Azure Key Vault的Sign API(ES256算法)要求请求体中的value是待签名内容的SHA-256哈希值,且需做base64url编码。你之前直接传入JWT的header.payload或payload的base64url,不符合API要求,导致错误。
正确操作步骤
1. 准备待签名的原始内容
比如你要签的JWT格式内容:header.payload,代码示例:
using Microsoft.IdentityModel.Tokens; string header = "{\"alg\": \"ES256\"}"; string payload = "{\"keyA\":\"value1\",\"keyB\":\"value2\",\"keyC\": \"value3\"}"; string contentToSign = Base64UrlEncoder.Encode(header) + "." + Base64UrlEncoder.Encode(payload);
2. 计算SHA-256哈希
对上述内容计算SHA-256哈希,得到标准32字节的二进制数据:
using System.Security.Cryptography; byte[] contentBytes = System.Text.Encoding.UTF8.GetBytes(contentToSign); byte[] sha256Hash; using (SHA256 sha256 = SHA256.Create()) { sha256Hash = sha256.ComputeHash(contentBytes); }
3. 对哈希值做base64url编码
将32字节的哈希值用base64url编码,得到符合要求的value参数:
string value = Base64UrlEncoder.Encode(sha256Hash);
4. 构造正确的请求体
最终请求体JSON格式如下:
{ "alg": "ES256", "value": "替换为上面生成的base64url编码哈希值" }
错误原因解析
- 第一次错误:直接传入
header.payload的base64url,这不是哈希值,完全不符合API对value的定义 - 第二次错误:传入payload的base64url,解码后是原始payload的字节数据(并非32字节的SHA-256哈希),长度不匹配ES256算法的要求
内容的提问来源于stack exchange,提问作者Brânica
相关产品推荐
相关产品推荐

