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

Bra*_*don 1 c# https proxy

在我的公司环境中,有一个透明的代理,需要凭据才能访问Internet(每四个小时一次).在我的应用程序中,我成功通过了以下凭据:

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

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

现在我目前的工作是:

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

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

Eug*_*its 7

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

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

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

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

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

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

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