2012-01-31 52 views
1

我tryed通過串口來搜索本地存儲sertificates用下面的代碼:C#證書搜索 - 爲什麼串行從贏視圖工具不工作

X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser); 
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); 

var certSerial = "‎18 99 ac c2 1e ed 69 ae"; //copied from Windows Certificates view tool 
certSerial = certSerial.Replace(" ", string.Empty).ToUpper(); 
var foundCerts = store.Certificates.Find(
     X509FindType.FindBySerialNumber, 
     certSerial , 
     true); 

...而一無所獲。然而然後我看着在調試模式下存儲和coppied證書的,我想找到序列 - 1899ACC21EED69AE,改變了certSerial變量爲:

var certSerial = "1899ACC21EED69AE"; 

它返回我的權利證書。 在調試中,這兩個變量看起來都是一樣的 - 我應該怎麼做第一個代碼才行?我只是不明白爲什麼它表現如此。

回答

2

正如在FindBySerialNumber中所解釋的,序號必須是相反的順序,因爲它是一個整數。

重新輸入您字符串:

var certSerial = "‎18 99 ac c2 1e ed 69 ae"; 

當我把它貼在我的編輯,我收到:

var certSerial = "?18 99 ac c2 1e ed 69 ae"; 
+0

但爲什麼最後一個字符串的作品?反轉的字符串也不起作用。 (例如AE69 ...) 感謝您的回答。 – Ritro 2012-01-31 10:42:41

+0

你能看看我編輯我的答案。 – JPBlanc 2012-01-31 10:52:25

+0

是的,謝謝你,認爲我不夠小心。現在,即使沒有格式化第一個結果也是正確的。 – Ritro 2012-01-31 10:58:45

2

我今天拿到這個同樣的問題,發現了不同的解決方案:

 var store = new X509Store(StoreLocation.CurrentUser); 
     store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); 
     var certificates = store.Certificates; 
     X509Certificate2 match = null; 
     foreach(var item in certificates) 
     { 
      if (item.SerialNumber != null && item.SerialNumber.Equals(serial, StringComparison.InvariantCultureIgnoreCase)) 
      { 
       match = item; 
       break; 
      } 
     } 

如果您只需要有效證書,則可以使用Verify方法作爲示例:

match.Verify() 

貌似查找方法得到了一些文化問題.....

對不起,我的英語不好,希望這可以幫助別人。