如何在C#中通过指纹查找证书

我正在使用此代码通过其指纹find证书。 证书存在于个人证书库中的证书pipe理器中,但是此代码没有find该证书。

请告诉我我在哪里做错了。

namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string certThumbPrint = "‎‎fe14593dd66b2406c5269d742d04b6e1ab03adb1"; X509Store certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser); // Try to open the store. certStore.Open(OpenFlags.ReadOnly); // Find the certificate that matches the thumbprint. X509Certificate2Collection certCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint, certThumbPrint, false); certStore.Close(); // Check to see if our certificate was added to the collection. If no, throw an error, if yes, create a certificate using it. if (0 == certCollection.Count) { Console.WriteLine("Error: No certificate found containing thumbprint " ); } Console.ReadLine(); } 

在Googlesearch同一个问题时,偶然发现了这个问题,并在这里find了答案:如果像我一样,通过突出显示指纹并将其复制到剪贴板,您从MMC获得了“源代码”指纹,在屏幕的开始不可见的字符,所以:

string certThumbPrint =“fe14593dd66b2406c5269d742d04b6e1ab03adb1”;

实际上是

string certThumbPrint =“ INVISIBLECHARACTER fe14593dd66b2406c5269d742d04b6e1ab03adb1”;

如果你删除了这个不可见的字符(当你按下退格键或删除它时没有任何事情发生时,你可以告诉它是在那里),或者只需手工重新input指纹,你的代码应该可以正常工作。 现在,如果只有Visual Studio有一个“显示隐形字符”选项…

包含您的指纹的string文字在开头处有一个从左到右的标记 。 当MMC列出证书属性时,它将使用此字符在指纹值之前,以便即使在文本通常从右向左呈现的语言环境中,也会从左到右列出hex字节。

很有可能,这是一个有人用过的捷径,因为在属性列表中的某个值上添加一个字符比编写一些代码来dynamic更新编辑控件的样式更容易。 也许这是对本地化testing期间的错误报告的快速修复。

在MMC中,从左到右的标记具有非零宽度,您可以通过观察光标在箭头上移动时观察到的宽度,我注意到第一行的hex字节稍微偏移到右侧第二排。

在其他编辑器(如Visual Studio)中,从左到右的标记没有宽度,但是仍然可以通过注意当箭头横过时光标不移动来观察它。 KenD回答说,删除这个字符解决了这个问题。

快速识别不可见字符的方法:使用键盘select不可见字符; 然后将其粘贴到一些正常字符之间的Word中。 在Word中select它; 然后单击插入>符号>更多符号。 在“Unicode名称”下查看左下angular。

要确保这些LTR“\ u200e”和RTL“\ u200f”字符从您的指纹string中删除,请执行以下操作

 thumbprint = thumbprint.Replace("\u200e", string.Empty).Replace("\u200f", string.Empty).Replace(" ",string.Empty); 

最后一个stringreplace空白删除不是完全必要的,因为它发现我的证书有或没有他们。

其他麻烦的unicode字符可以在这里find

UTF-8编码表和Unicode字符

我的两个美分:我复制了MMC中的值,并将其粘贴在启用了白色空间的VS中。

开始时什么都没有,但最后还是有一个空间:“1e 52 73 0d 00 29 e6 85 7b e6 23 e2 fa c7 a5 08 ac 36 5e 57”

现在,在web.config文件中,我粘贴了维护所有空间的值,删除了最后的空格:“1e 52 73 0d 00 29 e6 85 7b e6 23 e2 fa c7 a5 08 ac 36 5e 57”

这工作正常。

如果我使用“1e52730d0029e6857be623e2fac7a508ac365e57”,删除我在其他post中看到的空间,不起作用…

希望这可以帮助;)

我能够通过编写一个控制台应用程序来检索证书上的所有证书并输出指纹ID,从而解决了问题。 我复制了控制台输出并准确地插入了指纹。 没有问题。 看起来像从MMC控制台复制导致问题,即使数据看起来相似。 我用这个网站作为读取所有证书的起点。

https://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.thumbprint(v=vs.110).aspx

我运行这个PowerShell脚本获取所有的指纹,并将输出redirect到一个文本文件,并从那里复制指纹。

 Get-ChildItem -path cert:\LocalMachine\My 

要redirect到输出到一个文本文件使用这个:

 Get-ChildItem -path cert:\LocalMachine\My > thumbprints.txt