.NET中如何使用私钥和RSASHA256算法生成JWT签名及解决报错
错误原因
- 算法与密钥类型不兼容:
RS256(即RsaSha256)属于非对称签名算法,必须搭配RSA非对称密钥使用。你代码中使用的SymmetricSecurityKey是专为HS256这类对称加密算法设计的密钥类型,二者无法匹配,是触发IDX10634报错的核心原因。 - 私钥解析逻辑错误:PEM格式的私钥去掉头尾标识和换行符后是Base64编码字符串,直接用
Encoding.UTF8.GetBytes转换会得到错误的二进制内容,无法正确还原RSA私钥。
解决方案
你需要先将PEM私钥正确加载为RSA实例,再使用RsaSecurityKey创建签名凭证,参考修正后的代码:
using System.Security.Cryptography; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; // 读取PEM私钥 var privateKeyPem = File.ReadAllText(@"C:\Cencosud\Git\APIs\Api_Unico\Unico.Infra.Data\API.Services\Implementations\.key.pem"); // 移除PEM头尾和换行 privateKeyPem = privateKeyPem .Replace("-----BEGIN PRIVATE KEY-----", string.Empty) .Replace("-----END PRIVATE KEY-----", string.Empty) .Replace(Environment.NewLine, string.Empty) .Trim(); // Base64解码得到私钥二进制 var privateKeyBytes = Convert.FromBase64String(privateKeyPem); // 加载为RSA实例 using var rsa = RSA.Create(); rsa.ImportPkcs8PrivateKey(privateKeyBytes, out _); // 创建RSA类型的安全密钥 var securityKey = new RsaSecurityKey(rsa); var tokenHandler = new JwtSecurityTokenHandler(); var token = tokenHandler.CreateToken(new SecurityTokenDescriptor { Issuer = "service_account_name@tenant_id.iam.acesso.io", Audience = "https://identityhomolog.acesso.io", SigningCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.RsaSha256) }); var jwt = tokenHandler.WriteToken(token);
如果你使用的是.NET 5以下的版本,没有内置
ImportPkcs8PrivateKey方法,可以引入BouncyCastle库完成RSA私钥的加载。
内容的提问来源于stack exchange,提问作者David Oliveira
相关产品推荐
相关产品推荐

