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

时间:2018-06-11 13:59:49

标签: c# ssl jwt

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

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

那么,有没有一种方法可以实现相同的结果,但只使用.NET标准代码?

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

3 个答案:

答案 0 :(得分:2)

您可以将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

答案 1 :(得分:2)

PemUtils library可以完全满足您的需求,无需使用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);
}

答案 2 :(得分:0)

只是扩展解决方案,这是完整的代码,工作(这是用于firebase auth令牌):

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
);