透明代理通过https访问时出现SSL错误

时间:2011-12-22 19:25:38

标签: c# https proxy

在我的公司环境中,有一个透明的代理,需要凭据才能访问互联网(每四个小时一次)。在我的应用程序中,我成功通过了这样的凭证:

var client = new WebClient();
client.Credientals = new NetworkCredential("username", "password");
string result = client.DownloadString("http://...");
// this works!

但是,当我的初始请求是" https://" url,有一个异常抛出:"底层连接已关闭:无法为SSL / TLS安全通道建立信任关系。"

现在我目前的工作是:

  • 在访问" https://"时捕获引发的WebException。 url
  • 将我的凭据添加到对任意" http://"的新请求中。现场
    • (这应该"打开"互联网四小时的窗口)
  • 返回并重新尝试" https://"请求

我想知道是否有更好/更清洁的方法来做到这一点?

1 个答案:

答案 0 :(得分:7)

您现在使用的是具有身份验证的HTTP代理。到现在为止还挺好。但它不适用于HTTPS请求,这就是原因:

SSL / TLS是端点安全性。这意味着必须通过单个加密通道在客户端和服务器之间发送数据。

当您连接到HTTP代理时,您告诉它“获取远程资源并将其发送给我”,这与端点安全性相矛盾。在这里,您没有直接连接到远程服务器,也无法验证其凭据。代理也可以窥视您的数据。

通常,可以使用HTTPS连接到常规HTTP代理,或者可以要求HTTP代理访问HTTPS资源,但这会破坏安全性,导致客户端无法验证服务器的凭据和HTTP代理记录或更改正在传输的数据。

HTTPS代理以不同的方式工作。在这里,您告诉HTTPS代理服务器“连接到远程地址,然后只重新发送传递的内容”。这样,代理在客户端和服务器之间创建了不透明的安全通道,从而保护了端点安全性。实际上,HTTPS代理可用于隧道传输任何流量,不一定是SSL。

因此,您需要通过发送CONNECT请求(包括您的身份验证)来建立隧道,然后通过同一个通道发送常规HTTP GET(URL中没有主机/地址) - 此请求将转到目标服务器,不是代理人。

我非常怀疑您的WebClient可以在发送请求之前建立隧道。作为选项,您可以使用我们的SecureBlackbox产品的HTTPBlackbox包,它允许您访问HTTP和HTTPS资源,并通过身份验证支持HTTPS代理(在SecureBlackbox中称为WebTunneling)。