X509Store证书出现问题。查找FindByThumbprint

我在使用方法X509Store.Certificates.Find时遇到问题

 public static X509Certificate2 FromStore(StoreName storeName, StoreLocation storeLocation, X509FindType findType, string findValue) { X509Store store = new X509Store(storeName, storeLocation); store.Open(OpenFlags.ReadOnly); try { //findValue = "7a6fa503ab57b81d6318a51ca265e739a51ce660" var results = store.Certificates.Find(findType, findValue, true); return results[0]; } finally { store.Close(); } } 

在这种情况下查找方法返回0结果( results.Count == 0 ),但如果我把findValue作为常量的方法查找证书。

 public static X509Certificate2 FromStore(StoreName storeName, StoreLocation storeLocation, X509FindType findType, string findValue) { X509Store store = new X509Store(storeName, storeLocation); store.Open(OpenFlags.ReadOnly); try { //findValue= "7a6fa503ab57b81d6318a51ca265e739a51ce660" var results = store.Certificates.Find(findType, "7a6fa503ab57b81d6318a51ca265e739a51ce660", true); return results[0]; } finally { store.Close(); } } 

我想你的例子是有点简化,你真的从configuration文件或类似的东西加载findValue 。 如果您已将证书信息对话框中的指纹复制粘贴到configuration文件(或代码中的string文字),则可能是第一个字符是不可见的Unicode“从左到右-标记”。 尝试删除configuration文件中的整个string, 包括引号 ,然后手工重新input。

我今天自己也遭受了这种奇怪的行为,花了一个多小时才弄明白。 我终于看到它的方式是使用debugging器来检查findValue的长度和哈希码以及证书对象的Thumbprint

我在这里拿出了一些答案,并将它们组合成一个静态方法,负责删除特殊字符和大写的所有内容。 希望别人可以使用它。

  public static X509Certificate2 GetCertificate(string thumbprint) { thumbprint = Regex.Replace(thumbprint, @"[^\da-zA-z]", string.Empty).ToUpper(); var store = new X509Store(StoreName.My, StoreLocation.LocalMachine); try { store.Open(OpenFlags.ReadOnly); var certCollection = store.Certificates; var signingCert = certCollection.Find(X509FindType.FindByThumbprint, thumbprint, false); if (signingCert.Count == 0) { throw new FileNotFoundException(string.Format("Cert with thumbprint: '{0}' not found in local machine cert store.", thumbprint)); } return signingCert[0]; } finally { store.Close(); } } 

我有同样的问题,并解决了它:

  1. 我将指纹从mmc直接复制到VS. 我比较了string,并没有发现任何区别。

  2. 使用hash.length检查长度,有一个区别,41与40。

有一个不可见的字符通过从mmc复制出来添加到string。


解决:

  1. 将指纹从mmc复制到Notepad.exe
  2. 再次复制这个string
  3. 粘贴到您的代码

它正在工作。

我成了这个受害者。 在指纹的Windows控制台pipe理单元显示中,不仅有Unicode“从左到右”的字符,而且还有小写的hex字符,每两个字符之间有一个空格。 CertUtil的输出也有小写字母和空格。 为了获得一个匹配,我不得不将findValue指定为已被转换为的string

  1. 删除主要的特殊字符,
  2. 删除字符集群之间的空白,
  3. 将所有字符更改为大写

这也使我绊倒了,我写了这个函数来清理从MMC复制和粘贴指纹:

 public string CleanThumbprint(string mmcThumbprint) { //replace spaces, non word chars and convert to uppercase return Regex.Replace(mmcThumbprint, @"\s|\W", "").ToUpper(); } ... var myThumbprint = CleanThumbprint("‎b3 ab 84 e5 1e e5 e4 75 e7 a5 3e 27 8c 87 9d 2f 05 02 27 56"); var myCertificate = certificates.Find(X509FindType.FindByThumbprint, myThumbprint, true)[0]; 

这个代码应该工作。

我想你已经从证书pipe理控制台复制了这个指纹。 并且该复制值包含在Visual Studio中不可见的unicode不可读符号。 尝试删除第一个不可见的符号,如果这是我想的,这应该工作。

我遇到了同样的事情。 我无法在这里find这个答案,所以我会发布。 在我看来,X509Store查找function只是平坦不起作用。 我通过一个简单的for循环validation了这一点,并手动检索证书。

  X509Store store = new X509Store(StoreName.Root,StoreLocation.LocalMachine); store.Open(OpenFlags.ReadOnly); X509Certificate cert = new X509Certificate(); for (int i = 0; i < store.Certificates.Count; i++) { if (store.Certificates[i].SerialNumber == "XXXX") { cert = store.Certificates[i]; } } 
 var results = store.Certificates.Find(findType, findType, true); 

我认为你的意思是第二个参数是“findValue”。

将代码replace为在商店中查找您的证书,如下所示:

 var results = store.Certificates.Find(findType, findValue, true); 

另外第三个参数是bool只有在证书有效时才返回证书。 所以确保你的证书是有效的。 如果你有一个自我签署的证书,那么只要通过第三个参数是“假”

这是上述build议的代码的简单版本,这是为我工作的

  private X509Certificate2 GetCertificate() { var certStore = new X509Store("my"); certStore.Open(OpenFlags.ReadOnly); try { const string thumbprint = "18 33 fe 3a 67 d1 9e 0d f6 1e e5 d5 58 aa 8a 97 8c c4 d8 c3"; var certCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint, Regex.Replace(thumbprint, @"\s+", "").ToUpper(), false); if (certCollection.Count > 0) return certCollection[0]; } finally { certStore.Close(); } return null; } 

我也遇到这个不可见的Unicode字符。 尝试使用记事本(Windows 10)以某种方式也不适合我。 最后,我使用PowerShell获取干净的指纹hex:

 PS C:\> $tp= (Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Subject -match "mycert"}).Thumbprint; PS C:\> $tp 

对于Unicode字符来说太多了。

为了让你知道隐形人物是什么,我看到mmc上的指纹是:75 3a …

然后我复制并粘贴到我的vim,我看到以下内容:

<200e> 75 3a …

所以,当你摆脱了第一个字符“<200e>”和额外的空格,你会没事的。