我怎样才能得到一个.net中只有pem文件es384 JWT令牌?

qhhrdooz  于 2022-12-14  发布在  .NET
关注(0)|答案(1)|浏览(115)
var payload = new Dictionary<string, object>()
      {
            //xxx
      };
          
var privateKey = ???;
// only got a pem file like 
//-----BEGIN PRIVATE KEY-----
//xxxxxxxxxxxxxxx
//-----END PRIVATE KEY-----

//how can i get a key for below jwt token generate

string token = Jose.JWT.Encode(payload, privateKey, JwsAlgorithm.ES384, new Dictionary<string, object>()
            {
                { "alg", "ES384" },
                { "type", "JWT" },
            });

我在网上搜索了几个小时,我得到了一些像这样的c# JWT load ES256 PEM file into CngKey (jose-jwt),但它不能解决我的问题,我想把pem文件转换为p12文件,但我没有证书文件,我只有一个pem文件。我真的需要解决方案,谢谢。
我尝试通过PEMReader从我获得的RSA参数创建ECDSA密钥:

RSAParameters rsaParameters;
            using (var stream = File.OpenRead("pem.pem"))
            {
                using (var reader = new PemReader(stream))
                {
                    rsaParameters = reader.ReadRsaKey();
                }
            }

            var key = ECDsa.Create(ECCurve.NamedCurves.nistP384);

            key.ImportParameters(new ECParameters()
            {
                Q = new ECPoint() {
                  X = rsaParameters.Q,//???
                  Y = rsaParameters.Q //???
                },
                D = rsaParameters.D
            });

但参数Q是ECPoint类型,在rsaParameters中Q是字节数组,我不知道如何处理

sshcrbum

sshcrbum1#

我不知道你是否找到了解决这个问题的方法。但我也曾为此而挣扎,最终找到了一个解决方案。我将在这里分享我的代码。

var filePath = _sessionSettings.Value.CertificatePath; //read certificate file from path
            var privateKeyPem = File.ReadAllText(filePath);

            var key = ECDsa.Create();
            key.ImportFromPem(privateKeyPem);

            var now = DateTime.UtcNow;

            var claims = new Dictionary<string, object>
            {
                { "aws:channel-arn", channelArn },
                { "aws:access-control-allow-origin", "*" }
            };

            var handler = new JsonWebTokenHandler();

            string token = handler.CreateToken(new SecurityTokenDescriptor
            {
                NotBefore = now,
                Expires = now.AddMinutes(30),
                IssuedAt = now,
                Claims = claims,
                SigningCredentials = new SigningCredentials(new ECDsaSecurityKey(key), "ES384")
            });

            var response = new PrivateSessionTokenResponse
            {
                Token = token
            };

            return response;

相关问题