我尝试使用点网生成X509Certificate2密钥对,但是缺少私钥

问题描述

我尝试使用dot-net创建私钥-公钥对并将其安装在本地密钥库中。当私钥未与公钥一起安装时,我感到困惑,然后我注意到,尽管证书的HasPrivateKey属性设置为true,但实际的PrivateKey属性是{{1} }。如何将私钥和公钥都添加到Windows密钥存储区?以后需要使用证书进行端口绑定。

我当前的代码基本上是这样的:

null

我已经搜索了互联网,但是找不到适合我的解决方案。真的为这个问题my了好几个小时。该程序是安装程序类型的程序,以前称为PowerShell,用于创建自签名证书,该证书仅在一半时间内有效,并且像地狱般肮脏。我仅限于dot-net 4.7.2,由于项目限制,我不能非常依赖外部库。

解决方法

将HasPrivateKey属性设置为true,实际的PrivateKey属性为null

您不应该信任或使用PrivateKey属性,对于基于ECDSA / ECDH / DH的证书,该属性始终为空,对于RSA和DSA,也可以为空(如您所见)。 GetRSAPrivateKey()方法(以及其他用于不同算法的方法)是更好的答案。

如何将私钥和公钥都添加到Windows密钥存储区?

问题在于CertificateRequest将密钥原样绑定到证书。您有一个临时密钥(由RSA.Create(4096)创建),因此证书与一个临时密钥相关联。当您将其添加到商店时,临时密钥便会被忘记。

您可以更改密钥创建方式以创建命名的CNG密钥,也可以仅将证书导出为PFX,使用PersistKeySet重新导入,然后将其添加到存储中。

var cert = req.CreateSelfSigned(DateTimeOffset.UtcNow.AddDays(-1),DateTimeOffset.UtcNow.AddYears(30));
cert.FriendlyName = firendly_name;

using (cert)
using (var tmpCert = new X509Certificate2(cert.Export(X509ContentType.Pfx),"",X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet))
using (var store = new X509Store(StoreName.My,StoreLocation.LocalMachine))
{
    store.Open(OpenFlags.ReadWrite);
    store.Add(tmpCert);
    store.Close();
}
,

不久前,我遇到了类似的问题,试图从Docker容器的代码中自动将证书添加到商店中。

我使用的解决方案是使用OpenSSL工具创建自证书,并将其保存在项目内的文件夹中。注意:我创建了一个pfx证书,以便在证书中包含私钥。

所以,我有如下代码

使用(X509Store store = new X509Store(StoreName.Root, StoreLocation.CurrentUser,OpenFlags.ReadWrite)){

store.Add(新 X509Certificate2(“证书路径/证书名称.pfx”, “ certificatePassword”));

}

注意2:“ StoreName.Root”和“ StoreLocation.CurrentUser”会有所不同,具体取决于要保存证书的存储。

希望您发现此解决方案有用!