2009-07-25 42 views

回答

72

x509Certificate在.NET v1.0/1.1中引入,並且(相對)功能受限。 它可用於獲取有關現有證書(有效日期,發行人等)的信息。它有簡單的方法/操作(即從磁盤讀取證書)。

x509Certificate2是具有附加功能的x509Certificate的子類。

  • 它表示實際的X509證書。
  • 它在.NET Framework v2.0中是新的。
  • 該類可讓您訪問所有V2和V3屬性(權限密鑰標識符和密鑰用法)。
  • 它支持從證書存儲裝載證書。
+6

`X509Certificate2`還有一個私鑰成員,它不是證書本身的一部分,但很方便與班級代表相關聯憎惡X.509證書。 – Bruno 2012-01-11 18:25:31

18

爲了完整起見,這裏是site linked to在@ dommer的答案相關章節的副本,因爲該網站可能不再是谷歌的緩存並只針對誰不知多久:

該框架的版本1.1除了允許您操縱證書的X509Certificate類以外幾乎沒有。在 事實上,v1.1 X509Certificate類只提供了基本的支持:它只有 可以訪問X509版本1字段(如有效日期,主題和公共密鑰的有效日期和日期, ),而不是版本2字段(如 權限密鑰標識符)和版本3字段(如密鑰 的使用情況)。沒有支持從證書 商店加載證書,也沒有設施訪問證書 撤銷列表或證書信任列表。 Microsoft利用Web Services Enhancement(WSE)工具包擴展了 證書類並提供了訪問證書存儲的類,從而改進了 。 現在可以在.NET 3.0/2.0框架庫中找到這些類。

第一個重大變化是一個新類,稱爲X509Certificate2,其中 派生自X509Certificate。訪問X509 證書字段的方法已被棄用,現在該類具有 屬性來訪問這些字段。另外,如果證書有 一個關聯的私鑰,那麼這個類就可以訪問這個密鑰。 如果私人密碼 受密碼保護,有些方法允許您提供密碼。密碼通過SecureString 參數傳遞,該參數是一種特殊類型,可確保當不再使用對象 時,它佔用的內存將被覆蓋,因此密碼不能被機器上的另一個進程讀取到 。 安全字符串和其他形式的受保護數據將在 的後面部分中進行介紹。

由於X509Certificate2從x509證書派生就意味着你 可以調用靜態方法CreateFromeCertFile和 CreateFromSignedFile通過X509Certificate2類。但是,這些方法返回一個X509Certificate對象,並且您不能將這個方法轉換爲X509Certificate2對象。 X509Certificate類已在版本3.0/2.0中進行了改進: :它提供了訪問 某些X509字段的屬性;它提供了導入和導出方法到 從字節數組初始化對象或從 證書生成一個字節數組,它具有構造函數將從文件(ASN.1 DER)和字節數組創建一個對象 。有趣的是,X509Certificate2類有一個構造函數,可以從X509Certificate對象創建一個 X509Certificate2對象。請注意, 雖然X509Certificate對象只能顯示X509v1字段,但可以從X509v3證書創建 ,因此如果您從X509Certificate對象創建 X509Certificate2對象,您將可以使用 訪問X509v3字段。

2

從「x509證書」到「X509Certificate2」轉換的X.509證書,嘗試這樣的事情:

X509Certificate X509 = sslStream.RemoteCertificate; 
X509Certificate2 X5092 = new X509Certificate2(X509); 
0

對於那些想讀證書,並以此來驗證一會只需創建一個X509Certificate2並在其構造函數中傳遞X509Certificate。

對於簽名程序集(exe),代碼應該是這樣的代碼,爲簡單起見我省略了錯誤驗證。

Module m = Assembly.GetEntryAssembly().GetModules()[0]; 
using (var cert = m.GetSignerCertificate()) 
using (var cert2 = new X509Certificate2(cert)) 
{ 
    var _clientHandler = new HttpClientHandler(); 
    _clientHandler.ClientCertificates.Add(cert2); 
    _clientHandler.ClientCertificateOptions = ClientCertificateOption.Manual; 
    var myModel = new Dictionary<string, string> 
    { 
     { "property1","value" }, 
     { "property2","value" }, 
    }; 
    using (var content = new FormUrlEncodedContent(myModel)) 
    using (var _client = new HttpClient(_clientHandler)) 
    using (HttpResponseMessage response = _client.PostAsync($"{url}/{controler}/{action}", content).Result) 
    { 
     response.EnsureSuccessStatusCode(); 
     string jsonString = response.Content.ReadAsStringAsync().Result; 
     var json = new Newtonsoft.Json.JsonSerializer(); 
     var myClass = JsonConvert.DeserializeObject<MyClass>(json); 
    } 
} 

很明顯,你的類不叫MyClass,而是你期望從Web服務中獲得的一些業務對象。

您可以通過發送您需要填寫的屬性&值來向您的操作發送課程。現在,您可以確保您收到的請求是來自有效的手機或Windows客戶端讀取請求證書,像這樣:

public class MyController : ApiController 
{ 
    public IHttpActionResult Get() 
    {   
     X509Certificate2 clientCertInRequest = Request.HttpContext.Connection.ClientCertificate; 
     if (!clientCertInRequest.Verify() || !AllowedCerialNumbers(clientCertInRequest.SerialNumber)) 
     { 
      Response.StatusCode = 404; 
      return null; 
     } 
     //your code 
    } 

}

而剩下的就是設置你的Web服務器接受客戶端證書。 ..您可以閱讀所有關於來自新格式的屬性,並且已經保護了您的公共Web服務,但由於僅僅被授權不夠好(如果它曾經是),所以大多數情況下都無法完成。