[英]How do I use SSL certificates with HttpWebRequest in C#?
目前,我正在編寫一個實用程序應用程序,該應用程序將連接到給定的IP和端口,並使用HttpWebRequest檢查SSL證書中的信息。 當我嘗試提取證書時,出現錯誤,引發了異常。 異常似乎是因為應對SSL證書的行為似乎觸發了另一次驗證檢查。
這是代碼,也許有人可以向我展示一種更好的方法來執行此操作,或者如果我缺少某些內容。 我不在乎SSL證書是否過期或與URL不匹配。 這些都與我的工作無關。
當我將委托中的X509Certificate分配給新變量,並在調試器中查看該變量時,所有屬性均顯示SSLCert.Issuer引發了類型為'System.Security.Cryptography.CyrptographicException'的異常
當我嘗試訪問SSLCert的屬性時,會引發以下異常: m_safeCertContext是無效的句柄
我正在搜索該異常,但是所有內容都指向一個無效的證書,如果該證書已過期,則可能為true,並且對於我要連接的IP和端口組合,可能為true。 但是由於我是使用IP而不是與通用名稱匹配的任何東西連接到IP的,所以我希望這樣,並且由於我仍然需要信息,因此不必擔心。
下面的代碼,對於什么不起作用和什么起作用,我也添加了一些注釋。
// To get around the SSL validation in the HttpWebRequest
System.Net.ServicePointManager.ServerCertificateValidationCallback =
delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
System.Security.Cryptography.X509Certificates.X509Chain chain,
System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
// The below works but isn't what I want. CertName and ExpireDate are both Strings
this.CertName = ProcessSubject(certificate.Subject);
this.ExpireDate = certificate.GetExpirationDateString();
// The below works but the X509Certificate SSLCert shows exceptions in the debugger for most of the properties.
this.SSLCert = certificate;
return true; // **** Always accept
};
HttpWebRequest myRequest = (HttpWebRequest)System.Net.WebRequest.Create("https://" + this.IP + ":" + this.Port + "/SSLCheck.html");
myRequest.KeepAlive = false;
myRequest.Method = "GET";
try
{
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
}
catch (Exception e)
{
if (e.Message != "The remote server returned an error: (404) Not Found.")
{
throw Exception("Error");
}
}
// THE BELOW FAILS
this.CertName = this.SSLCert.Subject;
這只是我的猜測。 我認為正在發生的事情是.NET使用SSL握手中傳遞的證書信息來創建一個證書對象,該對象在委托中傳遞給您。 該委托僅用於驗證目的。 調用完成后,.NET將關閉證書的安全句柄。 這就是為什么嘗試在回調之外訪問證書時調用失敗的原因。
要解決此問題,您可以在代理內部對證書進行序列化,並在代理外部對其進行反序列化。
(從下面的評論中編輯)
我想您需要做的是創建一個自定義類,並將所需的數據存儲在委托代碼中,而不是傳遞實際的證書引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.