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

时间:2012-06-20 08:23:07

标签: c# x509certificate

我正在使用此代码通过其指纹查找证书。证书存在于个人证书存储区中,但此代码未找到该证书。

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

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();
}

7 个答案:

答案 0 :(得分:194)

在谷歌搜索同一问题时偶然发现了这个问题,并找到答案here:如果像我一样,你通过突出显示指纹并将其复制到剪贴板,从MMC获得了“源”指纹,你几乎肯定在屏幕的开头就抓住了一个看不见的角色,所以:

  

string certThumbPrint =“fe14593dd66b2406c5269d742d04b6e1ab03adb1”;

实际上是

  

string certThumbPrint =“ INVISIBLECHARACTER fe14593dd66b2406c5269d742d04b6e1ab03adb1”;

如果你删除这个不可见的字符(当你按下退格键或在它旁边删除时你可以告诉它,似乎没有发生任何事情),或只是手动重新输入指纹,你的代码应该可以正常工作。现在,如果只有Visual Studio有一个“显示不可见字符”选项......

答案 1 :(得分:16)

包含指纹的字符串文字在开头有一个left-to-right mark。当MMC列出证书属性时,它会在指纹值前面加上此字符,这样即使在文本通常从右向左呈现的区域设置中,也会从左到右列出十六进制字节。

可能,这是某人所采用的捷径,因为更容易将字符添加到属性列表中的某个值,而不是编写一些代码来动态更新编辑控件的样式。也许这是在本地化测试期间快速修复错误报告。

在MMC中,从左到右的标记具有非零宽度,您可以通过观察光标移动时观察光标,并注意到第一行十六进制字节稍微向右移动与第二行相比。

在其他编辑器(如Visual Studio)中,从左到右的标记没有宽度,但您仍然可以通过注意箭头移动时光标不移动来观察它。正如肯德回答的那样,删除这个角色可以解决问题。

快速识别隐形字符的方法:使用键盘选择不可见的字符;然后将它粘贴到一些普通字符之间的Word中。在Word中选择它;然后点击插入>符号>更多符号。查看" Unicode名称"左下角。

答案 2 :(得分:9)

确保从指纹字符串中删除那些LTR“\ u200e”和RTL“\ u200f”字符 执行以下操作

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

删除空格的最后一个字符串替换不是完全必要的,因为它在有或没有它的情况下找到我的证书。

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

UTF-8 encoding table and Unicode characters

答案 3 :(得分:3)

我的两分钱:我在MMC中复制了这个值并将其粘贴在启用了White Spaces的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",正如我在其他帖子中看到的那样删除内部空间,不起作用......

希望这可以提供帮助;)

答案 4 :(得分:2)

我执行了以下操作以删除多余的字符,并删除所有其他无效的十六进制字符(以及ToUpper字符):

            thumbprint = Regex.Replace(thumbprint.ToUpper(), @"[^0-9A-F]+", string.Empty);

这使我可以直接从“证书管理器”对话框中复制指纹并将其直接粘贴到我的用法中。

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

我运行这个powershell脚本来获取所有指纹并将输出重定向到文本文件并从那里复制指纹。

Get-ChildItem -path cert:\LocalMachine\My

要重定向到输出到文本文件,请使用:

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