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

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

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

但是,当我的初始请求是“https://”url时,会发生exception抛出:“底层连接已关闭:无法为SSL / TLS安全通道建立信任关系。”

现在我目前的工作是:

  • 捕获访问“https://”url时抛出的WebException
  • 将我的凭据添加到对任意“http://”站点的新请求
    • (这应该“打开”互联网四小时的窗口)
  • 返回并重新尝试“https://”请求

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

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

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

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

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

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

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

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