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



我使用此代码通过其指纹查找证书。 证书存在于个人证书存储的证书管理器中,但此代码找不到该证书。

请告诉我我哪里做错了。

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

只是在谷歌搜索同一问题时偶然发现了这个问题,并在这里找到了答案:如果像我一样,您通过突出显示指纹并将其复制到剪贴板从MMC获得了"源"指纹,那么您几乎可以肯定在屏幕开始时捕获了一个不可见的字符,因此:

字符串证书指纹 = "fe14593dd66b2406c5269d742d04b6e1ab03adb1";

其实是

字符串证书指纹 = "不可见字符fe14593dd66b2406c5269d742d04b6e1ab03adb1";

如果您删除此不可见字符(当您按退格键或删除它旁边时,您可以说它在那里,但似乎没有任何反应),或者只是手动重新键入指纹,您的代码应该可以正常工作。现在,如果只有Visual Studio有一个"显示不可见字符"选项......

包含指纹的字符串文本在开头有一个从左到右的标记。当 MMC 列出证书属性时,它会在指纹值前面使用此字符,以便从左到右列出十六进制字节,即使在文本通常从右到左呈现的区域设置中也是如此。

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

在 MMC 中,从左到右的标记具有非零宽度,您可以通过观察光标在箭头上移动以及我注意到与第二行相比,第一行十六进制字节略微向右移动来观察这一点。

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

识别不可见字符

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

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

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

空格的最后一个字符串替换并不完全必要,因为它可以找到带有或不带有它们的证书。

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

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",删除我在其他帖子中看到的内部空间不起作用......

希望这对;)有所帮助

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

Get-ChildItem -path cert:LocalMachineMy

要重定向到文本文件的输出,请使用以下命令:

Get-ChildItem -path cert:LocalMachineMy > thumbprints.txt

我做了以下操作来删除多余的字符,并删除任何其他无效的十六进制(以及 ToUpper 它):

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

这允许我直接从证书管理器对话框中复制指纹,并将其直接粘贴到我的使用中。

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

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

最新更新