You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core调用Apple App Store Connect API生成JWT令牌报错如何解决

报错触发原因
  • 密钥类型不匹配:ES256(即EcdsaSha256)属于非对称加密算法,你使用了仅适用于对称加密的SymmetricSecurityKey类加载苹果下发的p8格式EC私钥,该组合不在IdentityModel库的支持范围内,因此触发报错。
  • 额外隐藏问题:payload中定义的aud字段多了一个末尾空格,写为"aud ",即使签名问题修复,后续调用API也会返回授权失败。
修复方案
  1. 改用ECDsaSecurityKey类加载解析后的p8私钥,匹配ES256算法的要求
  2. 修正payload中aud字段的多余空格
  3. 若使用.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:27:05