如何使用 WebRequest 使用 HTTPS 访问 SSL 加密站点?

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

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

如果提供的 网址是一个 https:// URL,那么这就是中断。谁能帮我修改一下这个代码,使它能够处理 SSL 加密的内容。谢谢。

200791 次浏览

这个链接将是你感兴趣的: http://msdn.microsoft.com/en-us/library/ds8bxk2a.aspx

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

您的方法是正确的,但是用户可能会向安装了无效 SSL 证书的站点提供 URL。你可以忽略这些问题,如果你把这一行放在实际的网络请求之前:

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;
}

This one worked for me:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

正如@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(
"EB8E0B28AE064ED58CBED9DAEB46CFEB3BD7ECA677...");
};

对于 占用 ABC1的 X509Certificate.GetCertHashString过载,您需要. NET 4.8。在旧版本中使用返回 SHA-1散列的 无参数过载


基于 Is it safe to test the X509Certificate.Thumbprint property when you know an invalid certificate is safe?

有关 VB.NET 版本的代码,请参见 在 VB.NET 中接受自签名的 TLS/SSL 证书