为了账号安全,请及时绑定邮箱和手机立即绑定

从证书存储导入的 X509 证书没有私钥

从证书存储导入的 X509 证书没有私钥

C#
繁星点点滴滴 2023-07-22 18:29:23
有一些简单的代码可以使用以下命令将带有私钥的证书导入到 Windows 证书存储中.net core 2.2:  using (var store = new X509Store(StoreName.Root,StoreLocation.CurrentUser))  {      store.Open(OpenFlags.ReadWrite);      store.Add(cert);      store.Close();  }还有一些同样简单的代码可以再次将其读出来: using (var store = new X509Store(StoreName.Root,StoreLocation.CurrentUser)) {    store.Open(OpenFlags.ReadOnly);    var certCollection = store.Certificates.Find(X509FindType.FindBySubjectName, commonName, validOnly);    store.Close();    return certCollection; }然而,尽管证书已成功检索到 certCollection 中,但它的私钥为 null 并且 hasPrivateKey 为 false,即使它们在之前的调用中不为 null 且为 true Add。为什么是这样?更新:using (RSA rsa = RSA.Create(keySize)) {         CertificateRequest certRequest = new CertificateRequest(         subjectName,         rsa,         HashAlgorithmName.SHA512,         RSASignaturePadding.Pkcs1);     certRequest.CertificateExtensions         .Add(newX509SubjectKeyIdentifierExtension(certRequest.PublicKey, false));       return certRequest;}
查看完整描述

2 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

您的密钥被创建为临时密钥,因此当将其添加到持久存储时,该密钥将被丢弃。


如果要将密钥持久保存到商店证书中,您需要直接将其创建为持久密钥,或者导出到 PFX 然后重新导入(这是最简单的形式):


// If you're planning on saving to a LocalMachine store you should also | in the

// X509KeyStorageFlags.MachineKeySet bit.

X509KeyStorageFlags storageFlags = X509KeyStorageFlags.PersistKeySet;


X509Certificate2 certWithPersistedKey =

    new X509Certificate2(

        certWithEphemeralKey.Export(X509ContentType.Pkcs12, ""),

        "",

        storageFlags);

现在certWithPersistedKey可以像您期望的那样添加。


查看完整回答
反对 回复 2023-07-22
?
心有法竹

TA贡献1866条经验 获得超5个赞

X509Certificate2 cert = new X509Certificate2("a.pfx", "password", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);

X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);

store.Open(OpenFlags.ReadWrite);

store.Add(xCertificate);

原因 当使用 X509Certificate 或 X509Certificate2 类安装证书时,X509Certificate 或 X509Certificate2 默认情况下会创建一个临时容器来导入私钥。当不再引用私钥时,私钥将被删除。


解决方法 要为私钥创建永久密钥容器,必须使用 X509KeyStorageFlags.PersistKeySet 标志来防止 .NET 删除密钥容器。

查看完整回答
反对 回复 2023-07-22
  • 2 回答
  • 0 关注
  • 270 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信