我有一个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()
答案 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
在这种情况下,证书主题中的所有元素都必须以该确切的格式列出。