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

在使用APN(苹果推送通知)API的同时,我实现了 token 化授权。这是苹果对其推送通知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);
}

结果是签名 token ,然后在使用API​​并发送推送通知时将其用作授权 header 。

它在我的开发机上运行良好,但是当我将其部署到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 key 存储之类的东西。

我应该怎么办?

最佳答案

.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”(椭圆曲线 key 交换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 key ,并且一切都很顺利。

10-08 15:15