.net core .Net Core 3.1 RSA-无法导入Pkcs8PrivateKey

.net core .Net Core 3.1 RSA-无法导入Pkcs8PrivateKey,.net-core,cryptography,amazon-ecs,asp.net-core-3.1,.net Core,Cryptography,Amazon Ecs,Asp.net Core 3.1,我有一个应用程序,它依赖于最初在.pem文件中收到的私钥。该应用程序在AWS ECS(Fargate)中作为docker容器运行。私钥内容已移动到AWS参数存储,以避免处理多个.pem文件 下面的代码导入此密钥并在我的本地计算机上运行。但在ECS中总是会抛出带有消息“ASN1损坏数据”的加密异常 string pkcs8KeyString = exchange.Pem; pkcs8KeyString = pkcs8KeyString

我有一个应用程序,它依赖于最初在.pem文件中收到的私钥。该应用程序在AWS ECS(Fargate)中作为docker容器运行。私钥内容已移动到AWS参数存储,以避免处理多个.pem文件

下面的代码导入此密钥并在我的本地计算机上运行。但在ECS中总是会抛出带有消息“ASN1损坏数据”的
加密异常

                string pkcs8KeyString = exchange.Pem;
                pkcs8KeyString = pkcs8KeyString.Replace("-----BEGIN PRIVATE KEY-----", string.Empty);
                pkcs8KeyString = pkcs8KeyString.Replace("-----END PRIVATE KEY-----", string.Empty);
                RSA rsa = RSA.Create();

                try
                {
                    rsa.ImportEncryptedPkcs8PrivateKey(ReadOnlySpan<char>.Empty, Convert.FromBase64String(pkcs8KeyString), out _);
                }
                catch (CryptographicException e)
                {
                    //Log to ECS
                    Console.WriteLine("The key could not be imported!");
                    Console.WriteLine($"{e.GetType().FullName} {e.Message}");
                    throw;
                }
string pkcs8KeyString=exchange.Pem;
pkcs8KeyString=pkcs8KeyString.Replace(“----开始私钥------”,string.Empty);
pkcs8KeyString=pkcs8KeyString.Replace(“----结束私钥------”,string.Empty);
RSA=RSA.Create();
尝试
{
rsa.ImportEncryptedPkcs8PrivateKey(ReadOnlySpan.Empty,Convert.FromBase64String(pkcs8KeyString),out 3;);
}
捕获(加密异常)
{
//登录到ECS
WriteLine(“无法导入密钥!”);
WriteLine($“{e.GetType().FullName}{e.Message}”);
投掷;
}

我的本地环境和ECS在这方面有什么不同?如何避免ECS中出现异常?

根据我对
ECDsa
的研究,该方法
ImportEncryptedPkcs8PrivateKey
确实需要在Linux上使用加密密钥(PEM with
EncryptedPrivate key
块)(或者在使用OpenSSL支持的实现时)并在给出未加密密钥时抛出。在Windows(CNG支持的实现)上,支持加密或非加密两种形式(仅使用
私钥的PEM
块)

如果使用unencrypred键,只需使用
importpkcs8 privateKey


编辑:刚刚用
RSA
进行了测试,其行为方式与
ECDsa

如何从参数存储加载exchange.Pem?。您能否共享您的任务定义详细信息和容器的任何entryscript?@Imran
exchange
exchange
的一个实例,它是param store数据绑定的对象。它通过
IConfiguration
注入到类中,相关值反序列化到
Exchange
对象中。我还将共享ECR部署shell脚本。aws ECR get login--不包括电子邮件--region us-east-1 |/bin/bash docker build-t project staging。docker tag project staging:latest 640848491082.dkr.ecr.us-east-1.amazonaws.com/project staging:latest docker push 6408491082.dkr.ecr.us-east-1.amazonaws.com/project staging:latestI我对
ECDsa
有类似的问题,目前我认为它可以在Windows上工作(使用CNG实现),但在Linux上不工作(使用OpenSSL实现)。很有趣,谢谢。我将尝试获取加密的私钥并返回接受您的答案。这将有助于
openssl pkcs8-in-priv.pem-topk8-v1 PBE-SHA1-3DES-out priv-crypt.pem
或使用更强的密码
openssl pkcs8-in-priv.pem-topk8-v2 aes-256-cbc-v2prf hmacWithSHA256-out enckey.pem
,或仅使用
ImportPkcs8PrivateKey
。也许这是一个有用的链接:。