2011-11-08 99 views
4

我想驗證證書鏈,我得到一個X509Certificate2集合,並且必須驗證所有證書是否構建一個鏈。X509Chain.Build()方法說明

通常情況下,爲了驗證證書連鎖,我應該從葉證書採取數字簽名並檢查它是否是由根證書籤名 - 在.NET 我不能找到一種方法來提取來自X509Certificate2對象的簽名。

因此,我認爲以下列方式使用X509Chain.Build()方法:

void ValidateChain(X509Certificate2Collection collection, X509Certificate2 leaf) 
    { 
     X509Chain x509Chain = new X509Chain(); 
     x509Chain.ChainPolicy.ExtraStore.AddRange(collection); 
     bool isValid = x509Chain.Build(leaf); 
    } 

但我有關於構建方法的一些問題:

  1. 我的理解,鏈條上還建有從我的電腦商店,而且我希望它僅由ExtraStore構建,我如何定義此行爲?
  2. 我看到,鏈建成後,它不包含根證書;我的問題是爲什麼,以及如何驗證該鏈具有根CA,因爲這不是鏈元素的一部分。

如果有人能向我解釋Build()方法的工作原理,我將非常感激。

+0

您是否找到解決方案? – ArielB

回答

0

試試這個代碼片斷出:

bool chainIsValid = false; 

var chain = new X509Chain(); 
chain.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot; 
chain.ChainPolicy.RevocationMode = X509RevocationMode.Online; 
chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 1, 0); 
chain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag; 

chainIsValid = chain.Build(certificate); 
+1

如果您看到第二個問題,提問者希望根證書成爲信任鏈的一部分。所以'X509RevocationFlag.ExcludeRoot'是錯誤的。應該使用'X509RevocationFlag.EntireChain'。 – Learner

1

您應該構建操作後使用ChainStatus值。 MSDN:

X509Chain對象具有全局錯誤狀態,稱爲ChainStatus,應該用於證書驗證。管理證書驗證的規則很複雜,並且很容易通過忽略所涉及的一個或多個元素的錯誤狀態來簡化驗證邏輯。全局錯誤狀態會考慮鏈中每個元素的狀態。