我正在尝试使用ES256算法生成JWT,以便通过谈话台进行验证(文档: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(..)方法意味着创建证书,如果可能,我想远离它。
答案 0 :(得分:1)
我在连接到Apple的应用商店连接API时遇到了相同的问题。他们向您提供一个带私钥的.p8文件,目前尚不清楚如何将其与jose-jwt集成(假定您具有X,Y和D或CngKey),该文件是我不太熟悉的数据对象。但是最后,这一点都不难。
在文本编辑器中打开.p8文件,然后复制出私钥。它是“ ---- BEGIN PRIVATE KEY ----”页眉和页脚之间的字符数据。删除换行符。您只有一个Base64编码的数据块。
var privateKey = "MAGTAguM[...]qaTKB2";
var key = CngKey.Import(Convert.FromBase64String(privateKey),
CngKeyBlobFormat.Pkcs8PrivateBlob);
return Jose.JWT.Encode(payload, key, JwsAlgorithm.ES256, extraHeaders);