如何使用 PEM 密钥在 C# 中对 JWT 进行签名/加密?



我需要创建自定义令牌,这些令牌需要使用Google提供的密钥进行签名。密钥以文本形式提供,如-----BEGIN PRIVATE KEY-----nMIIE....

我通过使用BouncyCastle读取PEM密钥并获取RSA密钥来工作,但是现在我需要这个项目在Linux下运行,所以我不能使用BouncyCastle,因为它只能在Windows下工作(它使用RSACryptoServiceProvider(。

那么,有没有办法让我只使用 .NET 标准代码来实现相同的结果?

我已经尝试将 PEM 文件转换为 PFX 文件,但我没有任何证书。尝试从这里或这里获取证书不起作用(OpenSSL 说证书不属于提供的密钥(。

您可以将 PEM 文件转换为 p12 文件,并使用该 p12 对 JWT 进行签名

var payload = new Dictionary<string, object>()
{
{ "sub", "mr.x@contoso.com" },
{ "exp", 1300819380 }
};
var privateKey=new X509Certificate2("my-key.p12", "password").GetRSAPrivateKey();
string token=Jose.JWT.Encode(payload, privateKey, JwsAlgorithm.RS256);

这是详细信息链接 https://github.com/dvsekhvalnov/jose-jwt#rs--and-ps--family

PemUtils 库将完全满足您的需求,它无需使用RSACryptoServiceProvider即可解码 PEM 和 DER 数据。它作为 NuGet 包提供,如果您有任何其他需求,我是该库的作者,因此请随时在 github 上打开问题。

这样的事情应该有效:

using (var stream = File.OpenRead(path))
using (var reader = new PemReader(stream))
{
var rsaParameters = reader.ReadRsaKey();
var key = new RsaSecurityKey(RSA.Create(rsaParameters));
var signingCredentials = new SigningCredentials(key, SecurityAlgorithms.RsaSha256);
}

只是为了扩展解决方案,这是完整的代码,可以工作(这是针对Firebase身份验证令牌的(:

var privateKey = new X509Certificate2("cert.p12", "password");
var credentials = new SigningCredentials(new X509SecurityKey(privateKey), SecurityAlgorithms.RsaSha256);
var claims = new List<Claim>(8)
{
new Claim(JwtRegisteredClaimNames.Sub, "firebase-adminsdk-vifbe@your-service.iam.gserviceaccount.com"),
};
var tokenHandler = new JwtSecurityTokenHandler();
return tokenHandler.CreateEncodedJwt(
"firebase-adminsdk-vifbe@your-service.iam.gserviceaccount.com",
"https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
new ClaimsIdentity(claims),
DateTime.UtcNow.AddSeconds(-60),
DateTime.UtcNow.AddSeconds(10 * 60),
DateTime.UtcNow,
_credentials
);

最新更新