我已将证书导入个人 - >证书。
我使用以下代码行按序列号查找我的证书,但我不能:
public X509Certificate2Collection FindCerts(string serialNumber)
{
var searchType = X509FindType.FindBySerialNumber;
var storeName = "MY";
var certificatesStore = new X509Store(storeName, StoreLocation.LocalMachine);
certificatesStore.Open(OpenFlags.OpenExistingOnly);
var matchingCertificates = certificatesStore.Certificates.Find(searchType, serialNumber, true);
certificatesStore.Close();
return matchingCertificates;
}
你能否告诉我为什么即使它在certificateStore.Certificates列表中也找不到我的证书?
注意:我的证书是由Go Daddy创建的
答案 0 :(得分:22)
我通过输入序列号而不是从属性窗口复制来解决此问题。我不知道为什么从这个窗口复制时,它在序列号的开头包含一个奇怪的字符。
答案 1 :(得分:7)
由于我也遇到过这个问题,我试图制定一个解决方法,以便能够从certmgr.msc复制粘贴值
我所做的总结:
// The value below is pasted from certmgr.msc
var sslCertificateSerialNumber="47 9f da c4 ad d7 33 a6 4c ad 54 d3 d9 95 67 1c";
// Remove all non allowed characters that entered the value while copy/paste
var rgx = new Regex("[^a-fA-F0-9]");
var serial = rgx.Replace(sslCertificateSerialNumber, string.Empty).ToUpper();
现在我找到了带有复制/粘贴值的正确证书。
答案 2 :(得分:0)
如果你确定机器商店中存在证书,你可以尝试将Find()的第三个参数作为'false'吗?
答案 3 :(得分:0)
证书序列号是二进制数据序列,表示无限长度的大int。如果您在某处看到了文本,这可能意味着文本被写为串行OR(更有可能)您正在看到Base64或Base16编码的二进制序列。在后一种情况下,您不会以简单的方式找到它 - 您需要解码序列并尝试这种方式。
答案 4 :(得分:0)
如果您要提取的是GoDaddy颁发的证书,您可以使用:
var certificateStore= new X509Store(StoreLocation.LocalMachine);
certificateStore.Open(OpenFlags.ReadOnly);
var certificates = certificateStore.Certificates;
foreach (var certificate in certificateStore)
{
if (certificate.Issuer.Contains("GoDaddy"))
{
答案 5 :(得分:0)
确保serialNumber是大写字符串。当sn为小写时,我在查找证书时遇到了一些问题。如果从证书的详细信息窗口复制sn,也要删除空格
答案 6 :(得分:0)
如果从Windows证书属性窗口复制,可能会意外地复制一些额外的不可见字符,这会破坏序列号搜索。
有关详细信息,请参阅此问题: X509 store can not find certificate by SerialNumber
答案 7 :(得分:0)
昨天我遇到了类似的问题,并花了几个小时试图找出原因为什么没有找到现有的证书。似乎Certificates.Find方法执行区分大小写的搜索。我使用String.Compare。
进行了递归方法X509Certificate2 storedCert = null;
for (int i = 0; i < store.Certificates.Count; i++)
{
if (String.Compare(store.Certificates[i].SerialNumber, MySerialNum, true) == 0)
{
storedCert = store.Certificates[i];
break;
}
}
答案 8 :(得分:0)
要按序列号查找,从mmc管理单元报告的序列号开始,删除所有空格和大写所有字母。为我工作。这会给你类似......
008CC59B72BE954F93F1435F6B86227600
正如其他人所说,在字符串的开头要特别注意“隐形特殊字符”。复制进出记事本以剥离它。对于从cert属性窗口复制的所有字段也是如此。