C#忽略证书错误?
在向远程Web服务发送Web服务请求期间,出现以下错误:
无法build立SSL / TLS安全通道的信任关系。 —> System.Security.Authentication.AuthenticationException:根据validation过程,远程证书是无效的。
有没有办法忽略这个错误,并继续?
看来远程证书没有签名。
我连接到的网站是www.czebox.cz
– 所以随时访问该网站,并通过安全例外甚至通知浏览器。
添加证书validation处理程序。 返回true
将允许忽略validation错误:
ServicePointManager .ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
失败的原因不是因为它没有签名,而是因为根证书不被客户信任。 与其closuresSSLvalidation,另一种方法是将根CA证书添加到您的应用信任的CA列表中。
这是您的应用目前不信任的根CA证书:
—– BEGIN CERTIFICATE —– MIIFnDCCBISgAwIBAgIBZDANBgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJDWjEs MCoGA1UECgwjxIxlc2vDoSBwb8WhdGEsIHMucC4gW0nEjCA0NzExNDk4M10xHjAc BgNVBAMTFVBvc3RTaWdudW0gUm9vdCBRQ0EgMjAeFw0xMDAxMTkwODA0MzFaFw0y NTAxMTkwODA0MzFaMFsxCzAJBgNVBAYTAkNaMSwwKgYDVQQKDCPEjGVza8OhIHBv xaF0YSwgcy5wLiBbScSMIDQ3MTE0OTgzXTEeMBwGA1UEAxMVUG9zdFNpZ251bSBS b290IFFDQSAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoFz8yBxf 2gf1uN0GGXknvGHwurpp4Lw3ZPWZB6nEBDGjSGIXK0Or6Xa3ZT + tVDTeUUjT133G 7Vs51D6z / ShWy + 9T7a1f6XInakewyFj8PT0EdZ4tAybNYdEUO / dShg2WvUyfZfXH 0jmmZm6qUDy0VfKQfiyWchQRi / Ax6zXaU2 + X3hXBfvRMr5l6zgxYVATEyxCfOLM9 a5U6lhpyCDf2Gg6dPc5Cy6QwYGGpYER1fzLGsN9stdutkwlP13DHU1Sp6W5ywtfL owYaV1bqOOdARbAoJ7q8LO6EBjyIVr03mFusPaMCOzcEn3zL5XafknM36Vqtdmqz IWR + 3URAUgqE0wIDAQABo4ICaTCCAmUwgaUGA1UdHwSBnTCBmjAxoC + gLYYraHR0 cDovL3d3dy5wb3N0c2lnbnVtLmN6L2NybC9wc3Jvb3RxY2EyLmNybDAyoDCgLoYs aHR0cDovL3d3dzIucG9zdHNpZ251bS5jei9jcmwvcHNyb290cWNhMi5jcmwwMaAv oC2GK2h0dHA6Ly9wb3N0c2lnbnVtLnR0Yy5jei9jcmwvcHNyb290cWNhMi5jcm WW gfEGA1UdIASB6TCB5jCB4wYEVR0gADCB2jCB1wYIKwYBBQUHAgIwgcoagcdUZW50 byBrdmFsaWZpa292YW55IHN5c3RlbW92eSBjZXJ0aWZpa2F0IGJ5bCB2eWRhbiBw b2RsZSB6YWtvbmEgMjI3LzIwMDBTYi4gYSBuYXZhem55Y2ggcHJlZHBpc3UvVGhp cyBxdWFsaWZpZWQgc3lzdGVtIGNlcnRpZmljYXRlIHdhcyBpc3N1ZWQgYWNjb3Jk aW5nIHRvIExhdyBObyAyMjcvMjAwMENvbGwuIGFuZCByZWxhdGVkIHJlZ3VsYXRp b25zMBIGA1UdEwEB / wQIMAYBAf8CAQEwDgYDVR0PAQH / BAQDAgEGMB0GA1UdDgQW BBQVKYzFRWmruLPD6v5LuDHY3PDndjCBgwYDVR0jBHwweoAUFSmMxUVpq7izw + R + S7gx2Nzw53ahX6RdMFsxCzAJBgNVBAYTAkNaMSwwKgYDVQQKDCPEjGVza8OhIHBv xaF0YSwgcy5wLiBbScSMIDQ3MTE0OTgzXTEeMBwGA1UEAxMVUG9zdFNpZ251bSBS b290IFFDQSAyggFkMA0GCSqGSIb3DQEBCwUAA4IBAQBeKtoLQKFqWJEgLNxPbQNN 5OTjbpOTEEkq2jFI0tUhtRx // 6zwuqJCzfO / KqggUrHBca + GV / qXcNzNAlytyM71 FMV / VwgL9gBHTN / IFIw100JbciI23yFQTdF / UoEfK /米+ IFfirxSRi8LRERdXHTEb vwxMXIzZVXloWvX64UwWtf4Tvw5bAoPj0O1Z2ly4aMTAT2a + Y + z184UhuZ / oGyMw eIakmFM7M7RrNki507jiSLTzuaFMCpyWOX7ULIhzY6xKdm5iQLjTvExn2JTvVChF Y + jUu / G0zAdLyeU4vaXdQm1A8AEiJPTd0Z9LAxL6Sq2iraLNN36 + NyEK / ts3mPLL
—–结束证书—–
您可以使用解码和查看此证书
此证书解码器或另一个证书解码器
IgnoreBadCertificates方法:
//I use a method to ignore bad certs caused by misc errors IgnoreBadCertificates(); // after the Ignore call i can do what ever i want... HttpWebRequest request_data = System.Net.WebRequest.Create(urlquerystring) as HttpWebRequest; /* and below the Methods we are using... */ /// <summary> /// Together with the AcceptAllCertifications method right /// below this causes to bypass errors caused by SLL-Errors. /// </summary> public static void IgnoreBadCertificates() { System.Net.ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications); } /// <summary> /// In Short: the Method solves the Problem of broken Certificates. /// Sometime when requesting Data and the sending Webserverconnection /// is based on a SSL Connection, an Error is caused by Servers whoes /// Certificate(s) have Errors. Like when the Cert is out of date /// and much more... So at this point when calling the method, /// this behaviour is prevented /// </summary> /// <param name="sender"></param> /// <param name="certification"></param> /// <param name="chain"></param> /// <param name="sslPolicyErrors"></param> /// <returns>true</returns> private static bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors) { return true; }
允许所有的证书是非常强大的,但也可能是危险的。 如果您只想允许有效证书和某些特定的证书,可以这样做。
System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate ( object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors sslPolicyErrors) { if (sslPolicyErrors == SslPolicyErrors.None) { return true; //Is valid } if (cert.GetCertHashString() == "99E92D8447AEF30483B1D7527812C9B7B3A915A7") { return true; } return false; };
在客户端configuration中禁用ssl证书validation。
<behaviors> <endpointBehaviors> <behavior name="DisableSSLCertificateValidation"> <clientCredentials> <serviceCertificate> <sslCertificateAuthentication certificateValidationMode="None" /> </serviceCertificate> </clientCredentials> </behavior>
为了进一步扩展BIGNUM的文章 – 理想情况下,你需要一个能够模拟你在生产中看到的条件的解决scheme,并且修改你的代码不会这样做,如果你忘记在部署代码之前忘记代码,这样做可能是危险的。
您将需要某种自签名证书。 如果你知道你在做什么,你可以使用二进制BIGNUM张贴,但如果不是,你可以去寻找证书。 如果您使用的是IIS Express,则您将拥有其中一个,您只需要find它。 打开Firefox或任何你喜欢的浏览器,并去你的开发网站。 您应该能够从URL栏中查看证书信息,根据您的浏览器,您应该能够将证书导出到文件。
接下来,打开MMC.exe,并添加证书pipe理单元。 将您的证书文件导入“受信任的根证书颁发机构”存储区,这就是您所需要的一切。 确保它进入商店而不是像“个人”这样的其他商店是很重要的。 如果你不熟悉MMC或证书,有许多网站提供了如何做到这一点的信息。
现在,整个计算机将隐式地信任它自己生成的任何证书,并且不需要添加代码来专门处理它。 当您转入生产时,只要您在那里安装了适当的有效证书,它将继续工作。 不要在生产服务器上这样做 – 这样做会很糟糕,而且除了服务器本身以外的任何其他客户端都无法工作。
如果您直接使用套接字并作为客户端进行身份validation,则Service Point Managercallback方法将不起作用。 这是为我工作的。 请仅用于testing目的 。
var activeStream = new SslStream(networkStream, false, (a, b, c, d) => { return true; }); await activeStream.AuthenticateAsClientAsync("computer.local");
这里的关键是在SSLstream的构造函数中提供远程证书validationcallback权限。
此代码为我工作。 我不得不添加TLS2,因为这正是我感兴趣的URL所使用的。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => { return true; }; using (var client = new HttpClient()) { client.BaseAddress = new Uri(UserDataUrl); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); Task<string> response = client.GetStringAsync(UserDataUrl); response.Wait(); if (response.Exception != null) { return null; } return JsonConvert.DeserializeObject<UserData>(response.Result); }