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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:06:07