通过代理的 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;
我知道 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;