c#JWT使用ES256,将privateKey加载到CngKey中以在talkdesk中验证(jose-jwt)

时间:2017-12-19 12:55:17

标签: c# algorithm encryption cng

我正在尝试使用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(..)方法意味着创建证书,如果可能,我想远离它。

1 个答案:

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