Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Linux和MacOS上导入PKCS#8-CngKey。导入不可用_C#_.net_.net Core_Jwt_Cng - Fatal编程技术网

C# 如何在Linux和MacOS上导入PKCS#8-CngKey。导入不可用

C# 如何在Linux和MacOS上导入PKCS#8-CngKey。导入不可用,c#,.net,.net-core,jwt,cng,C#,.net,.net Core,Jwt,Cng,我正在尝试使用HTTP/2 APN发送Apple推送通知。为此,我需要使用证书和加密。创建JWT令牌的我的代码: private string CreateJwtToken() { var header = JsonHelper.Serialize(new { alg = "ES256", kid = p8privateKeyId }); var payload = JsonHelper.Serialize(new { iss = teamId, iat = ToEpoch(Da

我正在尝试使用HTTP/2 APN发送Apple推送通知。为此,我需要使用证书和加密。创建JWT令牌的我的代码:

private string CreateJwtToken()
{
    var header = JsonHelper.Serialize(new { alg = "ES256", kid = p8privateKeyId });
    var payload = JsonHelper.Serialize(new { iss = teamId, iat = ToEpoch(DateTime.UtcNow) });

    var key = CngKey.Import(Convert.FromBase64String(p8privateKey), CngKeyBlobFormat.Pkcs8PrivateBlob);
    using (var dsa = new ECDsaCng(key))
    {
        dsa.HashAlgorithm = CngAlgorithm.Sha256;
        var headerBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(header));
        var payloadBasae64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(payload));
        var unsignedJwtData = $"{headerBase64}.{payloadBasae64}";
        var signature = dsa.SignData(Encoding.UTF8.GetBytes(unsignedJwtData));
        return $"{unsignedJwtData}.{Convert.ToBase64String(signature)}";
    }
}

虽然这在Windows上运行良好,但Linux和MacOS上不支持
CngKey.Import
。如何重写此代码以使其跨平台?

从.NET Core 3.0开始,所有非对称Gorithm类型都支持PKCS#8密钥导入

private string CreateJwtToken()
{
    var header = ...;
    var payload = ...;

    using (ECDsa key = ECDsa.Create())
    {
        key.ImportPkcs8PrivateKey(Convert.FromBase64String(p8privateKey), out _);

        string headerBase64 = ...;
        string payloadBase64 = ...;
        string unsignedJwtData = ...;
        byte[] encodedRequest = Encoding.UTF8.GetBytes(unsignedJwtData);

        byte[] signature = key.SignData(encodedRequest, HashAlgorithmName.SHA256);

        return $"{unsignedJwtData}.{Convert.ToBase64String(signature)}";
    }
}

感谢您的意见。我试试看!