[英]How to find certificate by its thumbprint in 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獲得了你的“源”指紋,你幾乎肯定會抓到一個屏幕開頭的隱形字符,所以:
string certThumbPrint =“fe14593dd66b2406c5269d742d04b6e1ab03adb1”;
實際上是
串certThumbPrint = “INVISIBLECHARACTER fe14593dd66b2406c5269d742d04b6e1ab03adb1”;
如果你刪除這個不可見的字符(當你按下退格鍵或在它旁邊刪除時你可以告訴它,似乎沒有發生任何事情),或者只是手動重新鍵入指紋,你的代碼應該可以正常工作。 現在,如果只有Visual Studio有一個“顯示隱形字符”選項...
包含指紋的字符串文字在開頭有一個從左到右的標記 。 當MMC列出證書屬性時,它會在指紋值前面加上此字符,這樣即使在文本通常從右向左呈現的區域設置中,也會從左到右列出十六進制字節。
可能,這是某人所采用的捷徑,因為更容易將字符添加到屬性列表中的某個值,而不是編寫一些代碼來動態更新編輯控件的樣式。 也許這是在本地化測試期間快速修復錯誤報告。
在MMC中,從左到右的標記具有非零寬度,您可以通過觀察光標在箭頭上移動時觀察到,並且我注意到第一行十六進制字節與右側相比略微向右移動第二排。
在其他編輯器(如Visual Studio)中,從左到右的標記沒有寬度,但您仍然可以通過注意箭頭移動時光標不移動來觀察它。 正如肯德回答的那樣,刪除這個角色可以解決問題。
快速識別隱形字符的方法:使用鍵盤選擇不可見字符; 然后將它粘貼到一些普通字符之間的Word中。 在Word中選擇它; 然后單擊插入>符號>更多符號。 查看“Unicode名稱”下的左下角。
確保從指紋字符串中刪除那些LTR“\\ u200e”和RTL“\\ u200f”字符執行以下操作
thumbprint = thumbprint.Replace("\u200e", string.Empty).Replace("\u200f", string.Empty).Replace(" ",string.Empty);
刪除空格的最后一個字符串替換是完全必要的,因為它找到我的證書有或沒有它們。
其他麻煩的unicode角色可以在這里找到
我的兩分錢:我復制了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”,刪除我在其他帖子中看到的空間,不起作用...
希望這可以幫助;)
我做了以下刪除多余的字符,並刪除任何其他無效的十六進制(和ToUpper):
thumbprint = Regex.Replace(thumbprint.ToUpper(), @"[^0-9A-F]+", string.Empty);
這使我可以直接從證書管理器對話框中復制指紋,並將其直接粘貼到我的使用中。
我能夠通過編寫一個控制台應用程序來解決問題,該應用程序檢索證書上的所有證書並輸出指紋ID。 我復制了控制台輸出並准確插入了指紋。 沒有問題。 似乎從MMC控制台復制會導致問題,即使數據看起來相似。 我用這個網站作為閱讀所有證書的起點。
我運行這個powershell腳本來獲取所有指紋並將輸出重定向到文本文件並從那里復制指紋。
Get-ChildItem -path cert:\LocalMachine\My
要重定向到輸出到文本文件,請使用以下命令:
Get-ChildItem -path cert:\LocalMachine\My > thumbprints.txt
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.