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(); } }
我有同样的问题,并解决了它:
-
我将指纹从mmc直接复制到VS. 我比较了string,并没有发现任何区别。
-
使用hash.length检查长度,有一个区别,41与40。
有一个不可见的字符通过从mmc复制出来添加到string。
解决:
- 将指纹从mmc复制到Notepad.exe
- 再次复制这个string
- 粘贴到您的代码
它正在工作。
我成了这个受害者。 在指纹的Windows控制台pipe理单元显示中,不仅有Unicode“从左到右”的字符,而且还有小写的hex字符,每两个字符之间有一个空格。 CertUtil的输出也有小写字母和空格。 为了获得一个匹配,我不得不将findValue指定为已被转换为的string
- 删除主要的特殊字符,
- 删除字符集群之间的空白,
- 将所有字符更改为大写 。
这也使我绊倒了,我写了这个函数来清理从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>”和额外的空格,你会没事的。