【问题标题】:How to read private key from store如何从存储中读取私钥
【发布时间】:2016-12-07 20:38:55
【问题描述】:

我的本​​地计算机商店中有一台 x509。我如何在 C# 中阅读? 我需要用这种方式获取私钥

RSACryptoServiceProvider rsa = (RSACryptoServiceProvider).cert.PrivateKey()

【问题讨论】:

    标签: c# rsa x509certificate2


    【解决方案1】:

    这将为您从“我的”(个人)商店获取证书。

    var store = new X509Store(StoreName.My);
    store.Open(OpenFlags.ReadOnly);
    var certificate = store.Certificates.Single(c => c.Thumbprint == "Whatever-Your-Thumbprint-Is");    
    store.Close();
    

    此时您将拥有一个 X509Certificate2,您可以从中访问 PrivateKey 属性。

    【讨论】:

    • 是的,我只需要知道如何从本地存储中检索证书。目前我在 C 盘上有证书并从那里读取它
    • @JohnM 您需要某种方法来确定您想要的证书。证书存储可以包含许多证书。通常使用指纹或 X500 DN。指纹更可取,因为它不太可能产生重复。此时,您可以在上面示例中的certificates 变量上使用Find 来查找您的确切证书。
    • 他的那条评论是在我编辑答案之前,顺便说一句-在不同的上下文中可能会读到不同的内容。是的,但是,如果您一直在寻找完全相同的内容,这是一个好方法来自商店的证书 - 指纹。
    • 是的,我应该提到我正在寻找可以通过指纹或主题检索的特定证书。我将它与 Web api 应用程序一起使用,将其保存到本地证书存储而不是用户存储的最佳做法是什么?我只是不想让证书在文件目录中一目了然,所以任何关于保护它不被窥探的建议都会受到欢迎。
    • 谢谢,这应该可以,但还没有尝试过。现在如果证书有密码,那么我需要在代码中的某个地方提供它吗?
    【解决方案2】:
     public void AddCertificate()
        {
            if (this.ClientCertificates == null)
            {
                this.ClientCertificates = new X509CertificateCollection();
            }
            X509Certificate cert = new X509Certificate(path, pass, X509KeyStorageFlags.MachineKeySet);
            this.ClientCertificates.Add(cert);
        }
    

    【讨论】:

    • 如果该函数的托管类需要 ClientCertificates,那么该代码将添加它,但我认为这不是他要问的吗?
    • 这就是我现在检索证书和工作的方式,但让普通用户很容易看到。所以我想把它放在本地计算机商店并从那里读取它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2013-12-10
    相关资源
    最近更新 更多