通过代理的 HTTPS 不起作用

HTTPS over proxy doesn't work

我知道 Whosebug 和整个 Internet 上有大量的问题和答案完全相同或非常相似的错误消息,我很确定我已经阅读并尝试了其中的 90%。我仍然无法解决这个问题。

下面是 WebClient 的代码,由 Visual Studio 建议。但是我也尝试使用 HttpWebRequest/WebRequest,尽管警告说它已经过时了。没有变化,我得到了同样的错误:“请求被中止:无法创建 SSL/TLS 安全通道。”。

现在是代码。 makeProxy 实际上只有 3 行,一个新的 WebProxy 加上它的凭据。我相信它有效,因为 (a) 如果我在那里提供了错误的凭据,那么我会收到身份验证错误,(b) 如果我尝试访问 http 而不是 https 页面,那么我会取回它,所以我出去了在互联网上。

protected string getToken() {
    string url = ConfigurationManager.AppSettings["domo_api_url_auth"];    
    WebClient c = new WebClient();
    c.Proxy = makeProxy();
    c.Credentials = new NetworkCredential(ConfigurationManager.AppSettings["domo_api_cid"], ConfigurationManager.AppSettings["domo_api_pwd"]);
    c.Encoding = System.Text.Encoding.UTF8;

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
    // ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
    // ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate;

    Stream responseStream = c.OpenRead(url);
    return new StreamReader(responseStream).ReadToEnd();
}

我的问题是该消息不是很有帮助。我也试过调试它,没有帮助。我想到了我试图访问的 Web 服务站点上的证书,并完成了允许该证书用于 W3SVC 的过程。没有帮助。我对每个 https 站点都遇到同样的错误,例如 google.com 或 whosebug.com 或我自己公司的网站。但是当我只使用 http 访问一个随机新闻站点时,一切正常。

非常可疑的是,即使我取消注释第一行 ServerCertificateValidationCallback 时它也不起作用,而当我取消注释第二行时,假设将代码重定向到验证,它实际上永远不会到达那里。就像验证甚至不会开始一样。

如何解决这个问题?我什至不明白它在 Web 请求-响应过程的哪一点失败了。

除了 SSLv3 之外,您可能还需要激活 TLS:

ServicePointManager.SecurityProtocol = 
    SecurityProtocolType.Ssl3 | 
    SecurityProtocolType.Tls | 
    SecurityProtocolType.Tls11 | 
    SecurityProtocolType.Tls12;