X509Store Certificates.Find FindByThumbprint

时间:2015-06-16 04:29:17

标签: c# .net windows-server-2008-r2 x509certificate

使用store.Certificates.Find时遇到问题。我使用的是带有NET 3.5的Windows Server 2008 R2。证书由

安装
public static void AddCertificate(X509Certificate2 cert, StoreName name = StoreName.My, StoreLocation location = StoreLocation.LocalMachine)
    {
        var store = new X509Store(name, location);
        store.Open(OpenFlags.ReadWrite);
        store.Add(cert);
        store.Close();
    }

之后,通过

找到证书
string certThumbprint = "XXXX";
var certificates = store.Certificates.Find(X509FindType.FindByThumbprint, commandLineArgs.CertificateThumbprint, true);

if (certificates.Count == 0)
  {
    throw new ArgumentException("No certificate found with given thumbprint.");
  }

不应该抛出异常,但有时似乎会抛出异常。它每100次运行会抛出5次异常。

我用Google搜索并找到了"隐形的第一个字符"问题,但在我的情况下,指纹确实是硬编码的。我不是从任何地方阅读指纹。 使用NET.4.5在Windows Server 2012上运行的确切代码从未给我任何问题。这仅适用于使用NET.3.5的Windows服务器。我想知道为什么结果只在WS2008R2上如此不一致?

2 个答案:

答案 0 :(得分:0)

我认为问题可能是您的用户没有证书的权限

试试这个

  1. 下载并安装:Windows HTTP服务证书 配置工具(WinHttpCertCfg.exe) http://www.microsoft.com/en-us/download/details.aspx?id=19801
  2. 并运行:WinHttpCertCfg.exe -g -c LOCAL_MACHINE \ Store -s" IssuedToName" -a" AccountName"

答案 1 :(得分:0)

请确认证书确实存在于LocalMachine \ My Store中。我假设您将在商店中找到证书,但是当您双击它时,您将看到,这是不可信的。我的假设是证书链没有构建到受信任的根CA.

现在,修改您的代码以搜索证书(我已将最后一个参数更改为 false

var certificates = store.Certificates.Find(X509FindType.FindByThumbprint, commandLineArgs.CertificateThumbprint, false);

或(恕我直言)更好地通过将CA证书导入适当的商店(Root,Intermediate authority)来使导入的证书受信任。