下面是关于C# httpwebrequest访问HTTPS错误处理方法的完整攻略。
问题描述
当使用C#中的httpwebrequest请求HTTPS的时候,可能会遇到一些安全策略上的限制,导致请求失败或者返回错误信息。例如,常见的错误信息“Could not establish trust relationship for the SSL/TLS secure channel”,通常是由于请求的HTTPS连接端口未被信任所导致的。
解决方案
以下是解决这个问题的两个示例。
示例一:忽略HTTPS连接不信任的证书
当我们的HTTP请求是通过SSL/TLS协议加密的HTTPS请求时,需要验证HTTPS服务器是否是可信的,因此会对HTTPS连接进行证书验证。如果连接的服务器的证书不能通过本地信任链验证,HTTPS连接就会失败。但是,在某些情况下,我们可能只是需要简单地访问一些没有真正的SSL/TLS证书的HTTPS连接,此时我们可以使用以下示例代码来忽略HTTPS连接不信任的证书。
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, errors) => true;
上述代码将服务点管理器的服务器证书验证回调函数设置为一个总是返回 true
的 Lambda 表达式,这样就会忽略HTTPS连接不信任的证书。
注意:这种适用于只是为了完成HTTP请求而非正常使用HTTP服务。
示例二:手动处理HTTPS连接不信任的证书
在一些情况下,我们可能并不想完全忽略HTTPS连接的证书验证,而是想手动处理HTTPS连接不信任的证书,验证证书的可信度。此时,我们可以使用以下示例代码来手动处理HTTPS连接不信任的证书。
ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) =>
{
// 如果证书不为空而且有任何的错误,说明证书不被信任
if (cert != null && sslPolicyErrors != SslPolicyErrors.None)
{
// 如果证书是自签名的,而且证书的颁发者名称以 'CN=' 开头,那么表示证书被自签名
if (cert.Issuer.StartsWith("CN="))
{
// 通过证书里的公共名称(CN)验证证书
var commonName = cert.Subject.Split(new[] { "CN=" }, StringSplitOptions.None)[1];
if (commonName.StartsWith("*"))
{
commonName = commonName.Substring(1);
}
if (commonName.Equals("example.com"))
{
return true;
}
}
}
// 如果证书被完全信任,那么返回True
return sslPolicyErrors == SslPolicyErrors.None;
};
上述代码中,我们首先判断了证书是否可信,如果证书不为空而且有任何的错误,那么我们认为证书不被信任,此时我们可以手动验证证书的可信度。这里我们示例的处理逻辑是,认为证书是自签名的,并且证书的颁发者名称以 'CN=' 开头,则通过证书里的公共名称(CN)验证证书是否被信任。当证书公共名称(CN)是“example.com”时,则认为该证书是被信任的证书,在实际使用中,常见的手动处理逻辑可能会复杂得多,需要根据实际情况进行修改。
结束语
以上是关于C# httpwebrequest访问HTTPS错误处理方法的完整攻略。在HTTPS连接不被信任的情况下,以上示例代码可以让你在HTTP请求中绕过这些限制,得到你想要的结果。不过在实际使用中,请根据要求对证书的验证和HTTP请求进行细致的处理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# httpwebrequest访问HTTPS错误处理方法 - Python技术站