从Windows证书存储区找到特定证书(C# - ASP.Net)

时间:2017-10-19 14:19:47

标签: c# asp.net certificate x509

我有一个Web应用程序,它接收已签名的令牌,并应使用预先安装在最终用户计算机上的证书来验证该签名。我想访问商店并获得我想要使用的确切特定证书,到目前为止,我能够到达商店并计算内部的证书,但我找不到特定的证书。

我的策略是通过主题名称为X509Certificate2Collection填写证书的搜索结果,因为它足够独特,可以选择确切的所需证书,然后我拉出集合中的第一个元素(希望是唯一的)和使用它,这就是我在下面的代码中所做的,到目前为止,我总是得到certs为空的异常,我无法将任何内容转换为字符串。

如果我使用序列号搜索,这可以正常工作,但我的证书的序列号是00,我的商店里有8个这样的产品!

如何从商店获取特定证书并以编程方式使用它?

X509Store st0re = new X509Store(StoreName.Root, StoreLocation.CurrentUser);
            st0re.Open(OpenFlags.ReadOnly);
            count = st0re.Certificates.Count;       //Count the certificates in the store
            X509Certificate2Collection certs = st0re.Certificates.Find(
                X509FindType.FindBySubjectName,
                "C=US, S=WA, L=Redmond, O=Microsoft Corporation, OU=Web Services",
                true);
            st0re.Close();

            Output = certs[0].ToString();       // = count.ToString()

1 个答案:

答案 0 :(得分:0)

在考虑了@ Crypt32的建议之后,我将我的令牌移到了托管应用程序的位置,所以这样我就不会在最终用户的机器上查找证书,而是会本地存储在托管应用程序的服务器上。要搜索令牌,我在问题中使用完全相同的代码并进行非常轻微的编辑:

X509Store st0re = new X509Store(StoreName.Root, StoreLocation.CurrentUser);
        st0re.Open(OpenFlags.ReadOnly);
        count = st0re.Certificates.Count;       //Count the certificates in the store
        X509Certificate2Collection certs = st0re.Certificates.Find(
            X509FindType.FindBySubjectDistinguishedName,
            "C=US, S=WA, L=Redmond, O=Microsoft Corporation, OU=Web Services",
            true);
        st0re.Close();

        Output = certs[0].ToString();       // = count.ToString()

我所做的就是用X509FindType.FindBySubjectName替换X509FindType.FindBySubjectDistinguishedName 在这种情况下,证书主题中的所有元素都必须以该确切的格式列出。