15

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

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

    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;
    }

你能告诉我为什么我找不到我的证书,即使它在certificatesStore.Certificates 列表中?

注意:我的证书是由 Go Daddy 创建的

4

9 回答 9

23

我通过输入序列号而不是从属性窗口复制来解决了这个问题。我不知道为什么从这个窗口复制时,它在序列号的开头包含一个奇怪的字符。

于 2013-03-18T04:48:17.017 回答
8

因为我也遇到了这个问题,所以我尝试了一种解决方法,以便能够从 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();

现在我找到了带有复制/粘贴值的正确证书。

于 2015-01-07T14:54:58.523 回答
0

如果您确定机器存储中存在证书,您可以尝试将 Find() 的第三个参数设置为“false”吗?

于 2013-02-18T04:53:19.327 回答
0

证书序列号是一个二进制数据序列,表示一个无限长的大整数。如果您在某处看到该文本,这可能意味着该文本是串行编写的,或者(更有可能)您看到的是 Base64 或 Base16 编码的二进制串行。在后一种情况下,您不会以直接的方式找到它 - 您需要解码序列并尝试这种方式。

于 2013-02-18T06:21:28.823 回答
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"))
                {
于 2013-02-18T07:37:02.840 回答
0

确保 serialNumber 是大写字符串。当 sn 为小写时,我在查找证书时遇到了一些问题。如果您从证书的详细信息窗口中复制 sn,还要删除空格

于 2013-09-21T10:53:22.470 回答
0

如果您从 windows 证书属性窗口复制,您可能会不小心复制一些额外的不可见字符,这会破坏您的序列号搜索。

有关更多信息,请参阅此问题: X509 store can not find certificate by SerialNumber

于 2014-02-24T13:30:25.983 回答
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;
    }
}
于 2015-01-27T15:09:32.107 回答
0

要按序列号查找,从 mmc 管理单元报告的序列号开始,删除所有空格和大写所有 alpha。为我工作。这会给你类似...

008CC59B72BE954F93F1435F6B86227600

正如其他人所说,要特别注意字符串开头的“隐形特殊字符”。复制进出记事本以剥离它。从证书属性窗口复制的所有字段也是如此。

于 2015-12-04T13:22:47.903 回答