我需要将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)
答案 0 :(得分:0)
好吧,看来我错过了我在代码中其他地方确实要注意的重要事项。 需要在服务器上添加Exportable标志:
X509Certificate2 certificate = new X509Certificate2(certificateBytes, "mypass", X509KeyStorageFlags.Exportable);
此外,我需要以字节数组的形式从客户端发送它,而不将其转换为证书:
byte[] certs = File.ReadAllBytes("C:\\OpenSSLx64\\box\\ca\\newcerts\\myCert.pfx");
谢谢您的帮助。