有弹性的城堡GetRsaKeyPair:密钥在指定状态下无效

时间:2019-02-07 10:47:39

标签: c# cryptography bouncycastle

我需要将X509Certificate2与其公用密钥和专用密钥分开。 我想将证书加载到ONVIF摄像机。相机请求一个特殊的onvif类CertificateWithPrivateKey,我可以使用证书字节和私钥字节进行初始化。
该过程的方式是,首先我从客户端应用程序加载文件,在服务器上进行处理,然后将其发送到相机。

客户:

   X509Certificate2 certificate2 = new X509Certificate2("C:\\OpenSSLx64\\box\\ca\\newcerts\\myCert.pfx", "somepass", X509KeyStorageFlags.Exportable);
                byte[] certificateBytes = certificate.Export(X509ContentType.Pfx, "mypass");
                return Manager.LoadCertificateWithPrivateKey(certificateBytes);

如果我以X509Certificate2的形式发送,则PrivateKey部分在到达服务器时为空(服务器部分的第3行)。因此,我将其转换为byte[]。我知道整个数据都已发送,因为它在客户端和服务器上的大小相同。我将其转换回X509Certificate2

服务器:

X509Certificate2 certificate = new X509Certificate2(certificateBytes, "mypass");
OnvifCertifcateWithPrivateKey certificateWithPrivateKey = new OnvifCertifcateWithPrivateKey();
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider) certificate.PrivateKey;
MemoryStream memoryStream = new MemoryStream();
TextWriter streamWriter = new StreamWriter(memoryStream);
PemWriter pemWriter = new PemWriter(streamWriter);
AsymmetricCipherKeyPair keyPair = DotNetUtilities.GetRsaKeyPair(rsa);

这最后一行给我:在指定状态下无效的键。 但是,如果所有内容都不是通过网络发送的,则可以正常工作。通信基于.net远程。 堆栈跟踪: 密钥在指定状态下无效。

   at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
   at System.Security.Cryptography.Utils._ExportKey(SafeKeyHandle hKey, Int32 blobType, Object cspObject)
   at System.Security.Cryptography.RSACryptoServiceProvider.ExportParameters(Boolean includePrivateParameters)
   at Org.BouncyCastle.Security.DotNetUtilities.GetRsaKeyPair(RSA rsa)

1 个答案:

答案 0 :(得分:0)

好吧,看来我错过了我在代码中其他地方确实要注意的重要事项。 需要在服务器上添加Exportable标志:

X509Certificate2 certificate = new X509Certificate2(certificateBytes, "mypass", X509KeyStorageFlags.Exportable);

此外,我需要以字节数组的形式从客户端发送它,而不将其转换为证书:

  byte[] certs = File.ReadAllBytes("C:\\OpenSSLx64\\box\\ca\\newcerts\\myCert.pfx");

谢谢您的帮助。