如何使用WebRequest通过https访问SSL加密的站点?


116

我正在编写一个程序,该程序从用户提供的URL中读取内容。我的问题是在代码中是这样的:

Uri uri = new Uri(url);
WebRequest webRequest = WebRequest.Create(uri);
WebResponse webResponse = webRequest.GetResponse();
ReadFrom(webResponse.GetResponseStream());

如果提供的URL是“ https://” URL ,这将中断。任何人都可以帮助我更改此代码,以便它可以与SSL加密的内容一起使用。谢谢。

Answers:


175

您正在按照正确的方式进行操作,但是用户可能会向安装了无效SSL证书的站点提供URL。如果在发出实际的Web请求之前放入以下行,则可以忽略这些证书问题:

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);

在哪里AcceptAllCertifications定义为

public bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
    return true;
}

41
感谢您的回答!为了避免一些无用的代码,我这样使用它:ServicePointManager.ServerCertificateValidationCallback =(s,cert,chain,ssl)=> true;
查尔斯·欧厄莱特

4
谢谢,先生,你帮了我。F#使此操作变得如此简单:ServicePointManager.ServerCertificateValidationCallback <- Security.RemoteCertificateValidationCallback (fun _ _ _ _ -> true)
David Grenier 2012年

2
@Charles Ouellet我想我比你更懒惰,(a,b,c,d)=>正确
Despertar

24
我更喜欢+= delegate { return true; }
vkrzv 2012年

2
请注意与此方法相关的潜在风险。有关更多信息,请参见stackoverflow.com/a/6613434/2969615
乔·科伊尔

19

该链接将使您感兴趣:http : //msdn.microsoft.com/zh-cn/library/ds8bxk2a.aspx

对于http连接,WebRequest和WebResponse类使用SSL与支持SSL的Web主机进行通信。WebSSL类根据给出的URI决定使用SSL。如果URI以“ https:”开头,则使用SSL。如果URI以“ http:”开头,则使用未加密的连接。


很棒的链接。这是一个重要的区别。
DanM7 2015年

1
您的答案暗示问题中的代码应该起作用?
罗兰·肖

18

这个为我工作:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

1
默认值为“ Ssl2 | Tls”。我只在服务器上启用了Tls 1.1和1.2。这确实解决了问题!对于使用Linux上的nginX的LetsEncrypt,协议在此处定义:/etc/letsencrypt/options-ssl-nginx.conf
Jerther,

我认为这是一个不同的问题。这不是关于无效的证书,而是更高版本的TLS。
wp78de

我收到“远程主机强行关闭了现有连接”,此解决方案对我
有用

请注意,这是一个全局配置,因此您只需执行一次,而不必每次设置请求。
乍得Hedgcock

我可以以某种方式针对单个请求执行此操作吗?看来ServicePointManager是一件相当全球化的事情……
wexman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.