簡體   English   中英

如何在C#中通過指紋查找證書

[英]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角色可以在這里找到

UTF-8編碼表和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控制台復制會導致問題,即使數據看起來相似。 我用這個網站作為閱讀所有證書的起點。

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

我運行這個powershell腳本來獲取所有指紋並將輸出重定向到文本文件並從那里復制指紋。

Get-ChildItem -path cert:\LocalMachine\My

要重定向到輸出到文本文件,請使用以下命令:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM