我正在尝试使用 ES256 算法生成 JWT,以供talkdesk 验证(文档:https ://docs.talkdesk.com/docs/using-a-signed-jwt )。
但是我有一个 ADO.net 项目,所以我不能使用他们推荐的任何框架,所以我认为正确的路径是使用https://github.com/dvsekhvalnov/jose-jwt库。
jose-jwt 文档状态:
ES256、ES384、ES256 ECDSA 签名需要相应长度的 CngKey(通常是私有的)椭圆曲线密钥。通常现有的 CngKey 通过 Key Storage Provider 的 CngKey.Open(..) 方法加载。但是如果你想使用原始密钥材料 (x,y) 和 d,jose-jwt 提供了方便的帮助器 EccKey.New(x,y,d)。
我无法理解我从talkdesk 收到的私钥如何适合所有这些。
贝娄是我的代码:
public static string Encode(TenantModel tenant)
{
byte [] keyBytes= Encoding.UTF8.GetBytes(tenant.private_key);
var header = new Dictionary<string, object>()
{
{ "header", new { kid = tenant.key_id} }
//{ "algorithm", tenant.key_algorithm }
};
var payload = new Dictionary<string, object>()
{
{ "iss", tenant.client_id },
{ "sub", tenant.client_id },
{ "aud", "https://" + tenant.account_name + ".talkdeskid.com/oauth/token" },
{ "jti", Guid.NewGuid().ToString() },
{ "exp", DateTime.Now.AddSeconds(300) },
{ "iat", DateTime.Now }
};
var privatekey = new ECDsaCng(CngKey.Create(CngAlgorithm.ECDsaP256));
privatekey.SignData(keyBytes, 0, keyBytes.Length, HashAlgorithmName.SHA256);
return Jose.JWT.Encode(payload, privatekey, JwsAlgorithm.ES256,header);
}
我还看到使用 CngKey.Open(..) 方法意味着创建证书,如果可能的话,我想远离它。