【问题标题】:c# JWT using ES256, load privateKey into CngKey to be validated in talkdesk (jose-jwt)c# JWT 使用 ES256,将 privateKey 加载到 CngKey 中以在talkdesk (jose-jwt) 中进行验证
【发布时间】:2018-06-01 22:08:23
【问题描述】:

我正在尝试使用 ES256 算法生成 JWT,以供 Talk Desk 验证(文档: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(..) 方法意味着创建证书,如果可能的话,我想远离它。

【问题讨论】:

    标签: c# algorithm encryption cng


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2016-11-02
      • 2020-03-31
      • 2022-11-30
      • 1970-01-01
      • 2020-11-27
      • 2019-09-08
      • 2016-06-10
      • 2019-10-30
      • 2018-10-17
      相关资源
      最近更新 更多