90

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

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

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

7 回答 7

219

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

字符串 certThumbPrint = "‎‎fe14593dd66b2406c5269d742d04b6e1ab03adb1";

实际上是

string certThumbPrint = "‎‎<strong>INVISIBLECHARACTERfe14593dd66b2406c5269d742d04b6e1ab03adb1";

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

于 2013-02-13T11:40:23.047 回答
18

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

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

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

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

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

于 2015-06-02T01:28:39.073 回答
10

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

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

删除空格的最后一个字符串替换不是完全必要的,因为它发现我的证书有或没有它们。

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

UTF-8 编码表和 Unicode 字符

于 2015-06-03T15:08:55.630 回答
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”,删除我在其他帖子中看到的内部空间,不起作用......

希望这可以帮助;)

于 2015-05-20T09:04:40.357 回答
3

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

Get-ChildItem -path cert:\LocalMachine\My

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

Get-ChildItem -path cert:\LocalMachine\My > thumbprints.txt
于 2016-05-21T02:09:39.120 回答
2

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

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

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

于 2018-08-14T05:07:19.327 回答
0

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

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

于 2016-03-08T20:33:41.567 回答