无法按序列号查找证书

时间:2013-02-18 04:35:41

标签: c# asp.net x509certificate

我已将证书导入个人 - >证书。

我使用以下代码行按序列号查找我的证书,但我不能:

    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创建的

9 个答案:

答案 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属性窗口复制的所有字段也是如此。