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


82

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

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

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


X509Store实现,IDisposable因此应与using语句一起使用。
Alex Vallejo

Answers:


208

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

字符串certThumbPrint =“ fe14593dd66b2406c5269d742d04b6e1ab03adb1”;

实际上是

串certThumbPrint = “ INVISIBLECHARACTER fe14593dd66b2406c5269d742d04b6e1ab03adb1”;

如果删除此不可见字符(按退格键或在其旁边删除时可以知道它在那里,似乎什么也没发生),或者只是手动重新键入指纹,您的代码应该可以正常工作。现在,如果只有Visual Studio具有“显示不可见字符”选项,则...


2
VS具有“编辑”>“高级”>“查看空白”(Ctrl + R,Ctrl + W进行切换)-如果您知道查找内容,它可能会有所帮助。
Michael Freidgeim

@MichaelFreidgeim它没有帮助。VS不显示隐藏字符,仅显示空格字符。
George Polevoy 2014年

@MichaelFreidgeim视图空白至少在VS 2013中不会显示这些特殊的不可见字符。
杰里米·库克

我也确实喜欢从MMC中进行选择和复制。
莫茨2013年

3
圣洁@%$ @ $ !!! 这是史诗。浪费了时光,在紧紧的窗户旁玩耍,想知道为什么“ Foo” ==“ Foo”是错误的。先生,您值得赞扬。谢谢!
Thiago Silva

18

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

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

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

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

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


10

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

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

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

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

UTF-8编码表和Unicode字符


5

我的两分钱:我在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”,则删除其他帖子中看到的内部空间是行不通的...

希望这可以帮助;)


2

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

Get-ChildItem -path cert:\LocalMachine\My

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

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

这次真是万分感谢!我已经有证书,只是不知道。这揭示了我需要知道的。
rjacobsen0

2

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

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.