2010-08-19 64 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

相关问题