C#忽略证书错误?

C#忽略证书错误?,c#,.net,ssl,C#,.net,Ssl,在向远程web服务请求web服务期间,我遇到以下错误: 无法为SSL/TLS安全通道建立信任关系。-->System.Security.Authentication.AuthenticationException:根据验证过程,远程证书无效 是否仍要忽略此错误并继续 远程证书似乎没有签名 我连接到的网站是www.czebox.cz,所以请随意访问该网站,注意,即使浏览器也会抛出安全异常 添加证书验证处理程序。返回true将允许忽略验证错误: ServicePointManager .Se

在向远程web服务请求web服务期间,我遇到以下错误:

无法为SSL/TLS安全通道建立信任关系。-->System.Security.Authentication.AuthenticationException:根据验证过程,远程证书无效

是否仍要忽略此错误并继续

远程证书似乎没有签名


我连接到的网站是www.czebox.cz,所以请随意访问该网站,注意,即使浏览器也会抛出安全异常

添加证书验证处理程序。返回
true
将允许忽略验证错误:

ServicePointManager
    .ServerCertificateValidationCallback += 
    (sender, cert, chain, sslPolicyErrors) => true;

它失败的原因不是因为它没有签名,而是因为您的客户端不信任根证书。与其关闭SSL验证,另一种方法是将根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
oC2GK2h0dHA6Ly9wb3N0c2lnbnVtLnR0Yy5jei9jcmwvcHNyb290cWNhMi5jcmww
gfEGA1UdIASB6TCB5jCB4wYEVR0gADCB2jCB1wYIKwYBBQUHAgIwgcoagcdUZW50
byBrdmFsaWZpa292YW55IHN5c3RlbW92eSBjZXJ0aWZpa2F0IGJ5bCB2eWRhbiBw
b2RsZSB6YWtvbmEgMjI3LzIwMDBTYi4gYSBuYXZhem55Y2ggcHJlZHBpc3UvVGhp
cyBxdWFsaWZpZWQgc3lzdGVtIGNlcnRpZmljYXRlIHdhcyBpc3N1ZWQgYWNjb3Jk
aW5nIHRvIExhdyBObyAyMjcvMjAwMENvbGwuIGFuZCByZWxhdGVkIHJlZ3VsYXRp
b25zMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQW
BBQVKYzFRWmruLPD6v5LuDHY3PDndjCBgwYDVR0jBHwweoAUFSmMxUVpq7izw+r+
S7gx2Nzw53ahX6RdMFsxCzAJBgNVBAYTAkNaMSwwKgYDVQQKDCPEjGVza8OhIHBv
xaF0YSwgcy5wLiBbScSMIDQ3MTE0OTgzXTEeMBwGA1UEAxMVUG9zdFNpZ251bSBS
b290IFFDQSAyggFkMA0GCSqGSIb3DQEBCwUAA4IBAQBeKtoLQKFqWJEgLNxPbQNN
5OTjbpOTEEkq2jFI0tUhtRx//6zwuqJCzfO/KqggUrHBca+GV/qXcNzNAlytyM71
fMv/VwgL9gBHTN/IFIw100JbciI23yFQTdF/UoEfK/m+IFfirxSRi8LRERdXHTEb
vwxMXIzZVXloWvX64UwWtf4Tvw5bAoPj0O1Z2ly4aMTAT2a+y+z184UhuZ/oGyMw
eIakmFM7M7RrNki507jiSLTzuaFMCpyWOX7ULIhzY6xKdm5iQLjTvExn2JTvVChF
Y+jUu/G0zAdLyeU4vaXdQm1A8AEiJPTd0Z9LAxL6Sq2iraLNN36+NyEK/ts3mPLL

-----END CERTIFICATE-----
您可以使用解码和查看此证书


忽略BAD证书方法:

//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;
} 
//我使用一种方法忽略由杂项错误引起的错误证书
IgnoreBadCertificates();
//在忽略电话后,我可以做任何我想做的事。。。
HttpWebRequest_data=System.Net.WebRequest.Create(urlquerystring)作为HttpWebRequest;
/*
下面是我们正在使用的方法。。。
*/
/// 
///连同验收认证方法权利
///下面这将导致绕过由SLL错误引起的错误。
/// 
公共静态无效IgnoreBadCertificates()
{
System.Net.ServicePointManager.ServerCertificateValidationCallback=新系统.Net.Security.RemoteCertificateValidationCallback(AcceptualCertifications);
}  
/// 
///简而言之,该方法解决了证书损坏的问题。
///有时在请求数据和发送WebServer连接时
///是基于SSL连接的,错误是由
///证书有错误。比如证书过期的时候
///还有更多。。。所以在调用这个方法的时候,
///这种行为是被阻止的
/// 
/// 
/// 
/// 
/// 
///真的
私有静态布尔接受证书(对象发送方,System.Security.Cryptography.X509Certificates.X509Certificates证书,System.Security.Cryptography.X509Certificates.X509Chain-chain,System.Net.Security.SslPolicyErrors SslPolicyErrors)
{
返回true;
} 

进一步扩展BIGNUM的帖子-理想情况下,您需要一个能够模拟生产环境的解决方案,而修改代码则无法做到这一点,如果您在部署代码之前忘记取出代码,则可能会很危险

您需要某种类型的自签名证书。如果你知道你在做什么,你可以使用二进制BIGNUM post,如果不知道,你可以去寻找证书。如果您正在使用IIS Express,那么您已经有了其中一个,您只需找到它即可。打开Firefox或任何您喜欢的浏览器,并转到您的开发人员网站。您应该能够从URL栏查看证书信息,并且根据浏览器的不同,您应该能够将证书导出到文件中

接下来,打开MMC.exe,并添加证书管理单元。将您的证书文件导入受信任的根证书颁发机构存储,这就是您所需要的全部内容。重要的是要确保它进入那个商店,而不是像“个人”这样的其他商店。如果您不熟悉MMC或证书,那么有很多网站都提供了如何做到这一点的信息


现在,您的计算机作为一个整体将隐式地信任它自己生成的任何证书,并且您不需要添加代码来专门处理这个问题。当您投入生产时,只要您在那里安装了正确有效的证书,它将继续工作。不要在生产服务器上执行此操作-这将很糟糕,并且除了服务器本身上的客户端之外,它对任何其他客户端都不起作用。

在客户端配置中禁用ssl证书验证

<behaviors>
   <endpointBehaviors>
      <behavior name="DisableSSLCertificateValidation">
         <clientCredentials>
             <serviceCertificate>
                <sslCertificateAuthentication certificateValidationMode="None" />
              </serviceCertificate>
           </clientCredentials>
        </behavior>

如果您直接使用套接字并作为客户端进行身份验证,则服务点管理器回调方法将不起作用。这就是我的工作请仅用于测试目的

var activeStream = new SslStream(networkStream, false, (a, b, c, d) => { return true; });
await activeStream.AuthenticateAsClientAsync("computer.local");

这里的关键是在SSL流的构造函数中提供远程证书验证回调权。

允许所有证书非常强大,但也可能很危险。如果只允许有效证书加上某些证书,可以这样做

.Net核心:

using (var httpClientHandler = new HttpClientHandler())
{
    httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) => {
        if (sslPolicyErrors == SslPolicyErrors.None)
        {
            return true;   //Is valid
        }

        if (cert.GetCertHashString() == "99E92D8447AEF30483B1D7527812C9B7B3A915A7")
        {
            return true;
        }
        return false;
    };
    using (var httpClient = new HttpClient(httpClientHandler))
    {
        var httpResponse = httpClient.GetAsync("https://example.com").Result;
    }
}
.Net框架:

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;
};
更新:

//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;
} 
如何在Chrome中获取证书GetCertHashString()值:

单击地址栏中的
安全
不安全

然后单击证书->详细信息->指纹并复制值。记住执行
cert.GetCertHashString().ToLower()


这个代码对我很有用。我必须添加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);
}
ServicePointManager.SecurityProtocol=SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback+=
(发送方、证书、链、sslPolicyErrors)=>{return true;};
使用(var client=new HttpClient())
{
client.BaseAddress=新Uri(UserDataUrl);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(新建)
MediaTypeWithQualityHeaderValue(“应用程序/json”);
任务响应=client.GetStringAsync(UserDataUrl);
response.Wait();
if(response.Exception!=null)
{
返回null;
}
返回JsonConvert.DeserializeObject(response.Result);
}

绕过SSL证书

        HttpClientHandler clientHandler = new HttpClientHandler();
        clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; };

        // Pass the handler to httpclient(from you are calling api)
        var client = new HttpClient(clientHandler)
这适用于.NETCore。 调用您的Soap客户端:

client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication =
                new X509ServiceCertificateAuthentication()
                {
                    CertificateValidationMode = X509CertificateValidationMode.None,
                    RevocationMode = X509RevocationMode.NoCheck
                };  

老了,但仍然有帮助……