在ASP.NET、SQL Server、WCF等通訊領域,微軟都提供了基於SSL的安全保護機制。遺憾的是,.NET並沒有對SSL協議本身提供像TCP、UDP這樣的基礎網路通訊協定的編程性支援。如果想從協議的角度處理SSL通訊或者想構建完整的SSL架構,那麼.NET幫不上你,但是還有選擇,許多第三方安全通訊的項目提供了支援,比如OpenSSL。這不意味著我們在此領域將無所作為,第6章介紹了.NET中運算元字認證的兩個類:
q System.Security.Cryptography.X509Certificates.X509Certificate2類
q System.Security.Cryptography.X509Certificates.X509Store類
在Web開發中,SSL通訊由瀏覽器和Web伺服器來實現通訊細節。封裝了HTTP協議的WebRequest、WebResponse等類提供了處理HTTPS請求的能力。當我們在程式中向HTTPS連結發送請求的時候,可以擷取伺服器返回的認證。
請求HTTPS連結
當使用WebRequest類請求HTTPS連結的時候,在操作上和請求普通的HTTP連結沒什麼不同。代碼清單8-1示範了如何擷取一個HTTPS連結的方法。
代碼清單 8-1擷取HTTPS連結
try { Uri uri = new Uri("https://www.sample.com/https.aspx"); WebRequest http = HttpWebRequest.Create(uri); HttpWebResponse response = (HttpWebResponse)http.GetResponse(); Stream stream = response.GetResponseStream(); } catch(UriFormatException e) { Console.WriteLine("無效的URL"); } catch(IOException e) { Console.WriteLine("串連失敗"); }
代碼清單8-1中,通過HttpWebRequest對象的Create方法建立一個簡單的HTTPS請求,並反回一個HttpWebResponse對象。
說明 HttpWebRequest類對WebRequest中定義的屬性和方法提供支援,在使用HttpWebRequest對象向HTTP伺服器發起請求時請不要使用HttpWebRequest對象的建構函式,而應該使用WebRequest.Create()方法來初始化新的HttpWebRequest對象。如果統一資源識別項方案是"http://"或"https://"時,Create()則返回HttpWebResponse對象。
認證資訊的擷取與認證載入
在代碼清單8-1的基礎上,只需略加修改就可以讓程式適應需要提交用戶端認證的情況。如代碼清單8-2所示。
碼清單8-2 認證資訊的擷取與認證載入
public void Test() { Uri uri = new Uri("https://www.sample.com/https.aspx"); HttpWebRequest httpRequest = (HttpWebRequest)HttpWebRequest.Create(uri); X509Certificate cer = X509Certificate.CreateFromCertFile("認證檔案地址"); httpRequest.ClientCertificates.Add(cer); HttpWebResponse response = (HttpWebResponse)httpRequest.GetResponse(); Stream stream = response.GetResponseStream(); }
在代碼清單8-2中,首先建立一個X509Certificate對象,把它添加到WebRequest的ClientCertificates集合中。我們的認證一定要保護密鑰資訊。
在伺服器端,可以從用戶端請求的上下文中擷取用戶端提交的認證。
在Asp.NET中,可以通過下面的代碼來擷取認證資訊:
Request.ClientCertificate(key[SubField])
在上面的代碼中,Key指定要擷取認證欄位的名稱,不同的Key值具有不同的含義,SubField為可選欄位。Key具體資訊如表8-2所示。