【问题标题】:Can't find certificate by serial number通过序列号找不到证书
【发布时间】:2013-02-18 04:35:40
【问题描述】:

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

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

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

【问题讨论】:

  • 会将此添加为评论,但不能。只是想通过记事本添加复制和粘贴并没有摆脱特殊字符。您确实需要手动输入,同时删除空格。

标签: c# asp.net x509certificate


【解决方案1】:

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

【讨论】:

  • 可以确认这个问题。属性窗口中的序列号前有一个字符。复制到 VS 时它是不可见的,但它在那里。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我已经尝试将 Find() 设为“假”,但它不起作用。尝试调试时,我在 certificateStore.Certificates 集合中看到了我的证书:certificatesStore.Certificates[2] 正是我想要找到的。
    • 您能否在同一商店或不同商店获得任何其他证书?您可以尝试获取使用不同方法创建的证书(例如,使用“makecert”工具)吗? >makecert -r -len 2048 -a sha256 -n "CN=Test" -sr LocalMachine -sk test_key1 -ss My希望您提供的序列号不带任何空格...
    • 是的,“MY”商店里有 7 个证书,我能拿到其中的一些,用这个方法找不到 GoDaddy 证书。
    • 通过使用来自此 link 的 GetSerialNumberString。我已将 pfx 文件中返回的序列号输入到我的上述方法中,但它也不起作用。有什么帮助吗?
    • 您在调试时看到的集合中证书的序列号和输入序列号是否相同?
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      如果你要提取的是 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"))
                      {
      

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

            我昨天遇到了类似的问题,并花了几个小时试图找出究竟为什么找不到现有证书。似乎 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;
                }
            }
            

            【讨论】:

              【解决方案9】:

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

              008CC59B72BE954F93F1435F6B86227600
              

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-06-07
                • 2012-10-23
                • 2019-01-27
                • 2012-10-26
                • 1970-01-01
                • 2014-07-03
                • 2011-01-07
                • 2012-09-18
                相关资源
                最近更新 更多