如何解决我尝试使用点网生成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”会有所不同,具体取决于要保存证书的存储。
希望您发现此解决方案有用!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。