【问题标题】:Keys used with the ECDsaCng algorithm must have an algorithm group of ECDsa与 ECDsaCng 算法一起使用的密钥必须具有 ECDsa 算法组
【发布时间】:2017-10-14 07:22:54
【问题描述】:

我有以下问题,找不到解决办法:

在使用 APN(Apple 推送通知)API 时,我实现了令牌化授权。这是苹果在推送通知 API 上的新授权方式。

Apple 为我提供了私钥,我用它来创建 c# CngKey 对象,然后我用它来签署数据。

    CngKey key = CngKey.Import(
       Convert.FromBase64String(privateKey),
       CngKeyBlobFormat.Pkcs8PrivateBlob);

using (ECDsaCng dsa = new ECDsaCng(key))
{
    dsa.HashAlgorithm = CngAlgorithm.Sha256;
    var unsignedJwtData =
        Url.Base64urlEncode(Encoding.UTF8.GetBytes(header)) + "." + Url.Base64urlEncode(Encoding.UTF8.GetBytes(payload));
    var signature =
        dsa.SignData(Encoding.UTF8.GetBytes(unsignedJwtData));
    return unsignedJwtData + "." + Url.Base64urlEncode(signature);
}

结果是签名令牌,然后我在使用 API 和发送推送通知时将其用作授权标头。

它在我的开发机器上运行良好,但是当我将它部署到 Windows Server 时,当此代码运行时,我会得到下一个:

System.ArgumentException: Keys used with the ECDsaCng algorithm must have an algorithm group of ECDsa.
Parameter name: key
   at System.Security.Cryptography.ECDsaCng..ctor(CngKey key)
   at OTTCommon.Encryption.ECDSA.SignES256(String privateKey, String header, String payload, ILog log)

我找不到解决方案,它是 Windows 密钥存储或类似的东西......

我该怎么办?

【问题讨论】:

    标签: c# apple-push-notifications ecdsa apn cng


    【解决方案1】:

    这在 .NET Framework 4.6.2 中已修复,因此最简单的解决方案可能是升级服务器。

    适用于 NIST P-256、NIST P-384 和 NIST P-521 的解决方法是更改​​ blob 导出中的 dwMagic 值。 (它不适用于 Windows 10 通用 ECC,因为 dwMagic 值的对齐方式不同)。

    byte[] blob = key.Export(CngKeyBlobFormat.EccPrivateBlob);
    key.Dispose();
    

    此 blob 的前 4 个字节映射到 BCRYPT_ECCKEY_BLOB 结构中的 dwMagic 值。

    BCRYPT_ECDH_PRIVATE_P256_MAGIC 具有值0x324B4345,它是“ECK2”(椭圆曲线密钥交换 2)的 Little-Endian 表示。 BCRYPT_ECDSA_PRIVATE_P256_MAGIC 的值为 0x32534345,它是“ECS2”(椭圆曲线签名 2)的 Little-Endian 表示。

    // Change it from Key-exchange (ECDH) to Signing (ECDSA)
    blob[1] = 0x53;
    
    key = CngKey.Import(blob, CngKeyBlobFormat.EccPrivateBlob);
    

    现在它发现它是一个 ECDSA 密钥,并且一切正常。

    【讨论】:

    • 非常感谢您的快速回复!没想到这么快 :) 无论如何,我在我的开发机器上得到了 4.6.2 版本,而服务器有 4.6.1。我们将尝试将服务器升级到 4.6.2 网络版本,看看是否能解决问题。正如信息一样,解决方法在我的机器(Win7)上不起作用,我得到“不支持请求的操作”。例外。
    • 当我将 windows server 2012r2 .NET 版本升级到 4.6.2 时它工作了!问题已解决,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    相关资源
    最近更新 更多