是否可以通过查看证书来确定是否正在使用HTTPS代理?
由于HTTPS代理将自己替换SSL证书,因此我有哪些选项可以确定给定的HTTPS连接是否在中间有代理?是否可以通过查看证书来确定是否正在使用HTTPS代理?
我将使用这些信息来确定我的应用程序策略,因为有些情况下我希望100%端到端的加密隧道不被任何第三方解密。
如果你能告诉我如何通过.NET应用程序或Silverlight中的C#来确定这一点,那更好。
对于初学者,here是一个使用.NET验证证书的示例方法,但我仍然不确定如何使用它来确定要验证的证书的哪一部分。另外,我认为ServicePointManger更像是一个“全局”连接类。当我测试单个HTTP连接时,使用这可能过于宽泛,而且我不确定ServicePointManager在Silverlight中是否可用。
你有几个选项。第一个选项是使用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;
}
谢谢,但我仍然需要弄清楚如何处理证书。有没有通过证书检测代理的通用方法?我必须硬编码预期的公钥字符串到我的应用程序吗?我也不确定这种方法是否在Silverlight中工作...我怀疑我是否可以在SLI沙箱中获得ServicePointManager访问 – LamonteCristo 2010-08-19 18:14:55
DoesRequestUseProxy的方法将不起作用,如果“ WCCP“用于防火墙。 WCCP是一个不需要客户端配置的透明代理。 BlueCoat是一个产品的例子,它将与来自防火墙的所有数据交互并透明地代理HTTPS流量。正因如此,我认为唯一的通用方法是分析证书本身。 – LamonteCristo 2010-08-19 19:57:09
我更新了我的答案,以显示如何检测Web请求是否使用代理。不幸的是,我只是确认我的答案中的代码都不会在Silverlight中工作。 – 2010-08-19 19:58:04
请问你的应用程序进行安全连接? WCF? HttpWebRequest的? – 2010-08-19 15:19:59
我正在寻找一种通用解决方案,它将解决所有基于.NET的通信方法。是的,我正在使用WCF和HTTPWebRequest – LamonteCristo 2010-08-19 15:21:54