簡體   English   中英

如何在C#中將SSL證書與HttpWebRequest一起使用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM