与ECDsaCng算法一起使用的密钥必须具有ECDsa的算法组

MIs*_*lav 4 c# apn apple-push-notifications cng ecdsa

我有以下问题,无法找到解决方案:

在使用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);
}
Run Code Online (Sandbox Code Playgroud)

结果是签名令牌,然后我在使用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)
Run Code Online (Sandbox Code Playgroud)

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

我该怎么办?

bar*_*njs 5

这在.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();
Run Code Online (Sandbox Code Playgroud)

此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);
Run Code Online (Sandbox Code Playgroud)

现在它看到它是一个ECDSA密钥,一切都很开心.

  • 非常感谢快速回复!没想到这么快:)总之,我的dev机器上有4.6.2版本,服务器有4.6.1.我们将尝试将服务器升级到4.6.2网络版,看看是否能解决问题.就像信息,解决方法在我的机器(Win7)上不起作用,我得到"不支持所请求的操作." 例外. (2认同)
  • 当我将 Windows Server 2012r2 .NET 版本升级到 4.6.2 时它起作用了!问题已解决,非常感谢! (2认同)