回答
x509Certificate在.NET v1.0/1.1中引入,並且(相對)功能受限。 它可用於獲取有關現有證書(有效日期,發行人等)的信息。它有簡單的方法/操作(即從磁盤讀取證書)。
x509Certificate2是具有附加功能的x509Certificate的子類。
- 它表示實際的X509證書。
- 它在.NET Framework v2.0中是新的。
- 該類可讓您訪問所有V2和V3屬性(權限密鑰標識符和密鑰用法)。
- 它支持從證書存儲裝載證書。
爲了完整起見,這裏是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字段。
從「x509證書」到「X509Certificate2」轉換的X.509證書,嘗試這樣的事情:
X509Certificate X509 = sslStream.RemoteCertificate;
X509Certificate2 X5092 = new X509Certificate2(X509);
對於那些想讀證書,並以此來驗證一會只需創建一個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服務,但由於僅僅被授權不夠好(如果它曾經是),所以大多數情況下都無法完成。
- 1. .net 4.0和.net 4.0.3有什麼區別?
- 2. .NET和ASP.NET有什麼區別嗎
- 3. C#和.NET有什麼區別?
- 4. .NET double和python float有什麼區別?
- 5. C#.net和Visual Basic.net有什麼區別?
- 6. Netduino和.NET Gadgeteer有什麼區別?
- 7. 有什麼區別`和$(Bash中有什麼區別?
- 8. .NET中的System.Collections,System.Collections.Specialized和System.Collections.Generic有什麼區別?
- 9. .NET中的lambda表達式和謂詞有什麼區別?
- 10. .Net中的ConcurrentQueue和BlockingCollection之間有什麼區別?
- 11. .NET中的KeyValuePair和Hashtable有什麼區別?
- 12. .NET中的「global :: System」和「System」有什麼區別?
- 13. .NET RegEx中的組和匹配有什麼區別?
- 14. .Net中的App.Config和Web.Config有什麼區別?
- 15. .net中的readonly屬性和函數有什麼區別?
- 16. .NET 4中的EnumerateFiles和EnumerateFileSystemEntries有什麼區別?
- 17. .NET微型框架和.NET精簡框架有什麼區別?
- 18. 有什麼區別? :和||
- 19. &&和||有什麼區別?
- 20. 「/」和「/ *」有什麼區別?
- 21. 有什麼區別:。!和:r!?
- 22. ==和===有什麼區別?
- 23. Appender和〜有什麼區別?
- 24. $ @和$ *有什麼區別?
- 25. is和=有什麼區別?
- 26. #.00和#。##有什麼區別?
- 27. `==`和`is`有什麼區別?
- 28. '=='和'==='有什麼區別?
- 29. /和/#/有什麼區別?
- 30. | 0和~~有什麼區別?
`X509Certificate2`還有一個私鑰成員,它不是證書本身的一部分,但很方便與班級代表相關聯憎惡X.509證書。 – Bruno 2012-01-11 18:25:31