我正在使用此代码通过其指纹查找证书。证书存在于个人证书存储区中,但此代码未找到该证书。
请告诉我我在哪里做错了。
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();
}
答案 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字符可以在这里找到
答案 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控制台复制会导致问题,即使数据看起来相似。我用这个网站作为阅读所有证书的起点。
答案 6 :(得分:0)
我运行这个powershell脚本来获取所有指纹并将输出重定向到文本文件并从那里复制指纹。
Get-ChildItem -path cert:\LocalMachine\My
要重定向到输出到文本文件,请使用:
Get-ChildItem -path cert:\LocalMachine\My > thumbprints.txt