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

本文关键字:SSL 错误 访问 https 代理 透明 | 更新日期: 2023-09-27 18:18:34

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

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

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

现在我的工作是:

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

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

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

您现在使用的是带身份验证的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)与认证。