【问题标题】:How to sign/encrypt JWT in C# with PEM key?如何使用 PEM 密钥在 C# 中签名/加密 JWT?
【发布时间】:2018-11-20 19:25:39
【问题描述】:

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

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

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

我已经尝试将 PEM 文件转换为 PFX 文件,但我没有任何证书。尝试从herehere 获取证书无效(OpenSSL 表示证书不属于提供的密钥)。

【问题讨论】:

  • 我不是 c# 开发人员,但这个库 github.com/dvsekhvalnov/jose-jwt 可以帮助您生成 JWT
  • 我不需要生成 JWT 的方法。我能做到。我需要一种向 JWT 生成器提供签名/加密密钥的方法。

标签: c# ssl jwt


【解决方案1】:

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】:

    只是为了扩展解决方案,这是完整的代码,工作(这是用于 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
    );
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-24
        • 2019-05-09
        • 1970-01-01
        • 2013-03-16
        • 1970-01-01
        • 1970-01-01
        • 2018-01-09
        • 2010-11-12
        相关资源
        最近更新 更多