2011-03-11 44 views
8

目前我正在編寫一個實用程序應用程序,它將連接到給定的IP和端口,並使用HttpWebRequest檢查SSL證書中的信息。當我嘗試提取證書時,出現了一個拋出異常的錯誤。這個例外似乎是因爲應對SSL證書的行爲似乎觸發了另一個驗證檢查。如何在C#中使用HttpWebRequest的SSL證書?

這裏是代碼,也許有人可以告訴我一個更好的方法來做到這一點,或者如果我失去了一些東西。我不關心SSL證書是否過期或與URL不匹配。這些與我正在做的事無關。

當我指定的委託一個新的變量X509證書,並期待在調試器中的變量,所有屬性表明SSLCert.Issuer投擲型「System.Security.Cryptography.CyrptographicException」

的例外

當我嘗試訪問的sslcert的財產,我得到下面的異常拋出:m_safeCertContext是無效的句柄

I'be搜索的結果異常,但一切都指向一個無效的證書,這可能是如果證書已過期,則爲true,IP可能爲true和我正在連接的端口組合。但是,由於我使用IP連接到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; 
+0

這裏有很多關於在HttpWebRequest中使用SSL和證書的問題和解答。你有沒有看過右邊的「相關」問題,或者搜索了[ssl certificate httpwebrequest]? – 2011-03-11 16:13:51

+1

是的,幾乎每個人都在問如何使用客戶端證書,我沒有使用,或者因爲無效的證書而在HttpWebRequest中發生錯誤,我已經處理了這個錯誤。 – omniplex 2011-03-11 16:19:51

+0

我應該補充說,最大的問題是我想將X509Certificate複製到另一個X509Certificate類型變量,並且當我執行「this.SSLCert = certificate;」時,.NET似乎再次驗證了證書。 – omniplex 2011-03-11 16:23:30

回答

0

(編輯從我們下面的評論)

我想你需要做的是創建一個自定義類,並保存您在它需要委託代碼中,而不是通過實際的證書周圍的數據是什麼參考。

+0

不幸的是,同樣的問題。當委託接受一種類型的X509Certificate時,實際傳入的類型是X509Certificate2,所以我只是將它轉換爲它的名稱。雖然我確實嘗試過並重新檢查,但同樣的問題。 – omniplex 2011-03-11 16:41:06

+0

也許試試做一個成員的克隆呢? – 2011-03-11 16:45:49

+0

這是一個很好的嘗試,但奇怪的是,我將該方法看作是MSDN站點上的受保護方法,但是由於某些原因,它似乎不可用。 VS強調它是一個錯誤,它不會編譯。智能感知也不表明它是一種有效的方法。 – omniplex 2011-03-11 16:54:52

1

這只是我的猜測而已。我認爲正在發生的事情是,SSL握手中通過的證書信息被.NET用來創建一個在委託中傳遞給你的證書對象。代表僅用於驗證目的。調用完成後,.NET將關閉證書的安全句柄。這就是爲什麼當試圖在回調之外訪問證書時呼叫失敗。

爲了解決這個問題,您可以在代理內部序列化證書,並在委託之外反序列化它。

+0

謝謝,這幫了我(只需要一個證書屬性,所以我將它分配給代理的類作用域變量)。 – 2016-02-09 20:13:41