.NET Core调用Apple App Store Connect API生成JWT令牌报错如何解决
报错触发原因
- 密钥类型不匹配:
ES256(即EcdsaSha256)属于非对称加密算法,你使用了仅适用于对称加密的SymmetricSecurityKey类加载苹果下发的p8格式EC私钥,该组合不在IdentityModel库的支持范围内,因此触发报错。 - 额外隐藏问题:payload中定义的
aud字段多了一个末尾空格,写为"aud ",即使签名问题修复,后续调用API也会返回授权失败。
修复方案
- 改用
ECDsaSecurityKey类加载解析后的p8私钥,匹配ES256算法的要求 - 修正payload中
aud字段的多余空格 - 若使用.NET 5及以上版本,可直接用内置方法解析p8私钥,更低版本可引入BouncyCastle相关包实现解析
修复后代码示例
// 处理p8文件内容,去除头尾标识和换行符 var rawP8Key = "<p8文件的完整文本内容>"; var cleanedKey = rawP8Key .Replace("-----BEGIN PRIVATE KEY-----", string.Empty) .Replace("-----END PRIVATE KEY-----", string.Empty) .Replace("\r", string.Empty) .Replace("\n", string.Empty) .Trim(); var keyBytes = Convert.FromBase64String(cleanedKey); // 加载EC私钥 using var ecdsa = ECDsa.Create(); ecdsa.ImportPkcs8PrivateKey(keyBytes, out _); var securityKey = new ECDsaSecurityKey(ecdsa); // 生成签名凭证 var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.EcdsaSha256); var header = new JwtHeader(credentials); header.Add("kid", KeyID); var payload = new JwtPayload { { "aud", "appstoreconnect-v1"}, { "exp", exp}, { "iss", issuerID } }; var secToken = new JwtSecurityToken(header, payload); var handler = new JwtSecurityTokenHandler(); var tokenString = handler.WriteToken(secToken);
内容的提问来源于stack exchange,提问作者Display Name
相关产品推荐
相关产品推荐

