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

Posted

技术标签:

【中文标题】如何在 C# 中通过指纹查找证书【英文标题】:How to find certificate by its thumbprint in C# 【发布时间】:2012-06-22 08:25:14 【问题描述】:

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

请告诉我哪里做错了。

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

【问题讨论】:

Problems with X509Store Certificates.Find FindByThumbprint的可能重复 X509Store 实现了IDisposable,因此它应该与using 语句一起使用。 【参考方案1】:

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

字符串 certThumbPrint = "‎‎fe14593dd66b2406c5269d742d04b6e1ab03adb1";

其实是

string certThumbPrint = "‎‎INVISIBLECHARACTERfe14593dd66b2406c5269d742d04b6e1ab03adb1";

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

【讨论】:

VS 具有编辑 > 高级 > 查看空白(Ctrl+R、Ctrl+W 切换)- 可能帮助,如果你知道,寻找什么。 @MichaelFreidgeim 它没有帮助。 VS 不显示隐藏字符,只显示空格字符。 神圣的@%$@$!!!这是史诗。浪费时间,玩即时窗口,想知道为什么“Foo”==“Foo”是假的。先生,您值得一票。谢谢! 这解释了?我在日志中看到的角色!上帝保佑你先生 还有一篇来自微软的文章:support.microsoft.com/en-us/topic/…【参考方案2】:

我的两分钱:我复制了 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”,如我在其他帖子中看到的那样,删除里面的空间是行不通的......

希望这能有所帮助;)

【讨论】:

【参考方案3】:

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

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

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

在 Visual Studio 等其他编辑器中,从左到右的标记没有宽度,但您仍然可以通过注意当您的箭头越过 is 时光标没有移动来观察它。正如 KenD 所回答的,删除此字符即可解决问题。

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

【讨论】:

【参考方案4】:

确保从指纹字符串中删除那些 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

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

Get-ChildItem -path cert:\LocalMachine\My

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

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

【讨论】:

谢谢你!我已经有证书了,只是不知道。这揭示了我需要知道的内容。【参考方案7】:

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

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

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

【讨论】:

以上是关于如何在 C# 中通过指纹查找证书的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中通过 lpEnvironment 调用 CreateProcess()

.NET 通过 AppSetting 通过指纹查找证书

如何在解决方案中通过 FQN 查找类型?

如何在 discord.js 中通过 id 查找用户

如何在 C# 中通过电子邮件发送本地链接(共享服务器链接)?

如何从另一个 WinForm 中通过 C# WinForm 查看