122

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

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

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

4

4 回答 4

182

您正在以正确的方式进行操作,但用户可能会向安装了无效 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;
}
于 2009-02-18T14:24:33.440 回答
20

这个对我有用:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
于 2017-01-05T12:01:24.077 回答
18

您将对此链接感兴趣:http: //msdn.microsoft.com/en-us/library/ds8bxk2a.aspx

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

于 2009-02-18T12:20:19.060 回答
0

正如@LukeDuff 投票最多的答案正确地指出的那样,服务器很可能使用了无效或不受信任(或自签名,技术上也是不受信任)的证书。但是答案盲目地接受任何证书。更糟糕的是,即使是任何站点的任何证书,甚至是您期望受信任和有效证书的站点。这是一个安全漏洞。

实施ServicePointManager.ServerCertificateValidation回调时,应验证证书。例如,通过根据已知值检查证书的哈希:

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...");
    };

对于需要的X509Certificate.GetCertHashString重载HashAlgorithmName.SHA256,您需要 .NET 4.8。在旧版本上,使用返回 SHA-1 哈希的无参数重载


基于当您知道无效证书是安全的时测试 X509Certificate.Thumbprint 属性是否安全?

对于 VB.NET 版本的代码,请参阅在 VB.NET 中接受自签名 TLS/SSL 证书

于 2021-03-31T06:03:53.330 回答