我正在编写一个程序,从用户提供的URL读取内容。我的问题出在下面这样的代码中:
Uri uri = new Uri(url);
WebRequest webRequest = WebRequest.Create(uri);
WebResponse webResponse = webRequest.GetResponse();
ReadFrom(webResponse.GetResponseStream());
如果提供的URL是一个https://
url,这就会中断。谁能帮助我改变这段代码,使它将与SSL加密的内容。谢谢。
发布于 2009-02-18 14:24:33
您这样做是正确的,但是用户可能提供了指向安装了无效SSL证书的站点的urls。如果您在发出实际的web请求之前输入以下代码行,则可以忽略这些cert问题:
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;
}
发布于 2017-01-05 20:01:24
这个方法对我很有效:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
发布于 2021-03-31 14:03:53
正如@LukeDuff投票最多的答案所说的那样,可能是服务器使用了无效的或不可信的(或自签名的,从技术上讲也是不可信的)证书。但是答案盲目地接受任何证书。更糟糕的是,任何网站的任何证书,甚至是你希望获得可信和有效证书的网站也是如此。这是一个安全漏洞。
在实现ServicePointManager.ServerCertificateValidation
callback时,应该验证证书。例如通过对照已知值检查证书的散列:
using System.Net;
using System.Net.Security;
using System.Security.Cryptography;
ServicePointManager.ServerCertificateValidationCallback +=
(sender, certificate, chain, errors) =>
{
return
(errors == SslPolicyErrors.None) ||
certificate.GetCertHashString(HashAlgorithmName.SHA256).Equals(
"EB8E0B28AE064ED58CBED9DAEB46CFEB3BD7ECA67737179E3C85BC3CD09D4EEC");
};
对于X509Certificate.GetCertHashString
overload that takes HashAlgorithmName.SHA256
,您需要.NET 4.8。在较旧的版本中,使用返回SHA-1散列的the parameter-less overload。
基于
有关代码的VB.NET版本,请参阅。
https://stackoverflow.com/questions/560804
复制相似问题