在.NET的HttpWebRequest / Response中使用自签名证书

我正在尝试连接到使用自签名SSL证书的API。我这样做是使用.NET的HttpWebRequest和HttpWebResponse对象。我得到一个例外:


基础连接已关闭:无法为SSL / TLS安全通道建立信任关系。


我明白这意味着什么。而且我明白为什么 .NET认为它应该警告我并关闭连接。但是在这种情况下,无论如何,我还是想连接到API,这是该死的中间人攻击。


那么,如何为该自签名证书添加例外?还是告诉HttpWebRequest / Response根本不验证证书的方法?我该怎么做?


SMILET
浏览 988回答 3
3回答

慕尼黑8549860

事实证明,如果您只想完全禁用证书验证,则可以在ServicePointManager上更改ServerCertificateValidationCallback,如下所示:ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };这将验证所有证书(包括无效,过期或自签名的证书)。

慕侠2389804

使用代理上的sender参数,可以将Domster答案中使用的验证回调的范围限制为特定请求ServerCertificateValidationCallback。以下简单的作用域类使用此技术临时连接仅对给定请求对象执行的验证回调。public class ServerCertificateValidationScope : IDisposable{    private readonly RemoteCertificateValidationCallback _callback;    public ServerCertificateValidationScope(object request,        RemoteCertificateValidationCallback callback)    {        var previous = ServicePointManager.ServerCertificateValidationCallback;        _callback = (sender, certificate, chain, errors) =>            {                if (sender == request)                {                    return callback(sender, certificate, chain, errors);                }                if (previous != null)                {                    return previous(sender, certificate, chain, errors);                }                return errors == SslPolicyErrors.None;            };        ServicePointManager.ServerCertificateValidationCallback += _callback;    }    public void Dispose()    {        ServicePointManager.ServerCertificateValidationCallback -= _callback;    }}上面的类可用于忽略特定请求的所有证书错误,如下所示:var request = WebRequest.Create(uri);using (new ServerCertificateValidationScope(request, delegate { return true; })){    request.GetResponse();}
打开App,查看更多内容
随时随地看视频慕课网APP