2011-12-22 79 views
1

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

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

然而,当我INTIAL请求是一个“https://开头的” URL,有一个异常抛出:“基础连接已关闭:无法建立信任关系为SSL/TLS安全通道。“

现在我目前的解决办法是:

  • 渔获引发WebException抛出访问时“https://开头的” URL
  • 添加我的凭据到一个新的请求到任意的“http:// “网站
    • (这应该‘开放’互联网四小时的窗口)
  • 回去再试试‘https://开头’请求

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

+0

这似乎是一个坏主意。你真的想在清晰的情况下公开潜在的敏感数据吗? – 2011-12-22 19:31:43

+0

没有敏感数据通过明文发送(据我所知)。我添加到通用“http”请求的凭证被透明代理拦截。然后我重试了原始的“https”请求(自透明代理认证了我之后,它现在起作用) – Brandon 2011-12-22 19:36:08

+0

听起来你正在构建更多的中间人或传递服务器而不是真正的代理服务器(类似但是不同)。无论哪种方式,如果您允许代理的用户允许任何网站通过它,您可能会暴露敏感数据。 – 2011-12-22 19:40:48

回答

6

你现在使用的是一个带有认证的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)和身份验证。

+0

+1有关详细说明。我很好奇,是否仍有可能使用HTTP代理通过C#访问HTTP站点?假设我不介意安全性? – Gabrielius 2015-11-13 09:40:24

+0

@Gabrielius是的,从协议的角度来看,它只是一个“https:// address/path”资源的请求。实际上,对于HTTP代理来说,从哪里获取文件并不重要(因为代理支持所请求的协议,现在该集合通常仅限于HTTP和HTTPS,有时也仅限于FTP)。 – 2015-11-13 20:07:58

+0

您可以告诉我,为什么我在通过HTTP WebProxy访问HTTPs地址时遇到问题(使用'C#')?虽然HTTP网站一切正常。我得到'Timeout'或'Gateway'错误。正如我之前提到的,我不介意代理可以看到流量。 – Gabrielius 2015-11-16 11:59:05

相关问题