1

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

4

1 回答 1

2

我在连接到 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);
于 2019-01-22T18:39:21.080 回答