2010-08-19 60 views
3

由於HTTPS代理將自己替換SSL證書,因此我有哪些選項可以確定給定的HTTPS連接是否在中間有代理?是否可以通過查看證書來確定是否正在使用HTTPS代理?

我將使用這些信息來確定我的應用程序策略,因爲有些情況下我希望100%端到端的加密隧道不被任何第三方解密。

如果你能告訴我如何通過.NET應用程序或Silverlight中的C#來確定這一點,那更好。

對於初學者,here是一個使用.NET驗證證書的示例方法,但我仍然不確定如何使用它來確定要驗證的證書的哪一部分。另外,我認爲ServicePointManger更像是一個「全局」連接類。當我測試單個HTTP連接時,使用這可能過於寬泛,而且我不確定ServicePointManager在Silverlight中是否可用。

http://msdn.microsoft.com/en-us/library/bb408523.aspx

+0

請問你的應用程序進行安全連接? WCF? HttpWebRequest的? – 2010-08-19 15:19:59

+0

我正在尋找一種通用解決方案,它將解決所有基於.NET的通信方法。是的,我正在使用WCF和HTTPWebRequest – LamonteCristo 2010-08-19 15:21:54

回答

4

你有幾個選項。第一個選項是使用ServicePointManager類。你是在它管理的所有服務點是正確的,但你可以使用「發件人」參數中的回調方法不同的服務點之間進行區分:

void SomeMethod() 
{ 
    ServicePointManager.ServerCertificateValidationCallback += 
     ValidateServerCertificate; 

    var url = "https://mail.google.com/mail/?shva=1#inbox"; 
    var request = (HttpWebRequest)WebRequest.Create(url); 
    request.GetResponse(); 
} 

private static bool ValidateServerCertificate(object sender, 
     X509Certificate certificate, X509Chain chain, 
     SslPolicyErrors sslpolicyerrors) 
{ 
    if(sender is HttpWebRequest) 
    { 
     var request = (HttpWebRequest) sender; 
     if(request.RequestUri.ToString() == "https://mail.google.com/mail/?shva=1#inbox") 
     { 
      return (certificate.GetPublicKeyString() == "The public key string you expect"); 
     } 
    } 
    return true; 
} 

此選項將手動創建的HttpWebRequest和WCF工作創建的請求,因爲「發件人」將是HttpWebRequest。我不確定「發件人」是否是除HttpWebRequest之外的任何內容。

的第二個選擇是直接從服務點拿到證書:

void SomeMethod() 
{ 
    ServicePointManager.ServerCertificateValidationCallback += 
     ValidateServerCertificate; 

    var url = "https://mail.google.com/mail/?shva=1#inbox"; 
    var request = (HttpWebRequest)WebRequest.Create(url); 
    request.GetResponse(); 

    var serverCert = request.ServicePoint.Certificate; 
    // Validate the certificate. 
} 

我無法弄清楚是否有可能得到一個WCF代理使用的ServicePoint。如果這是不可能的,這個選項將不適用於WCF。除此之外,最大的區別是,如果證書驗證失敗,第一個選項將阻止連接,而第二個方法將在連接建立之後纔會生效。

如果你只是需要確定一個請求會通過代理:

var httpRequest = (HttpWebRequest)WebRequest.Create("someurl"); 
var isUsingProxy = DoesRequstUseProxy(request); 

bool DoesRequestUseProxy(HttpWebRequest request) 
{ 
    if(request.Proxy == null) 
    { 
     return false; 
    } 

    return request.Proxy.GetProxy(request.RequestUri) != request.RequestUri; 
} 
+0

謝謝,但我仍然需要弄清楚如何處理證書。有沒有通過證書檢測代理的通用方法?我必須硬編碼預期的公鑰字符串到我的應用程序嗎?我也不確定這種方法是否在Silverlight中工作...我懷疑我是否可以在SLI沙箱中獲得ServicePointManager訪問 – LamonteCristo 2010-08-19 18:14:55

+0

DoesRequestUseProxy的方法將不起作用,如果「 WCCP「用於防火牆。 WCCP是一個不需要客戶端配置的透明代理。 BlueCoat是一個產品的例子,它將與來自防火牆的所有數據交互並透明地代理HTTPS流量。正因如此,我認爲唯一的通用方法是分析證書本身。 – LamonteCristo 2010-08-19 19:57:09

+0

我更新了我的答案,以顯示如何檢測Web請求是否使用代理。不幸的是,我只是確認我的答案中的代碼都不會在Silverlight中工作。 – 2010-08-19 19:58:04

相關問題