当前位置:  开发笔记 > 编程语言 > 正文

如何使用c#2.0 WebClient忽略证书错误 - 没有证书

如何解决《如何使用c#2.0WebClient忽略证书错误-没有证书》经验,为你挑选了4个好方法。

使用Visual Studio 2005 - C#2.0,System.Net.WebClient.UploadData(Uri address, byte[] data) Windows Server 2003

所以这是代码的精简版本:

static string SO_method(String fullRequestString)
{
    string theUriStringToUse = @"https://10.10.10.10:443"; // populated with real endpoint IP:port
    string proxyAddressAndPort = @"http://10.10.10.10:80/"; // populated with a real proxy IP:port
    Byte[] utf8EncodedResponse; // for the return data in utf8
    string responseString; // for the return data in utf16

    WebClient myWebClient = new WebClient(); // instantiate a web client
    WebProxy proxyObject = new WebProxy(proxyAddressAndPort, true);// instantiate & popuylate a web proxy
    myWebClient.Proxy = proxyObject; // add the proxy to the client
    myWebClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); // stick some stuff in the header

    UTF8Encoding utf8Encoding = new UTF8Encoding(false);// create a utf8 encoding
    Byte[] utf8EncodedRequest = HttpUtility.UrlEncodeToBytes(fullRequestString, utf8Encoding); // convert the request data to a utf8 byte array

    try
    {
        utf8EncodedResponse = myWebClient.UploadData(theUriStringToUse, "POST", utf8EncodedRequest); // pass the utf8-encoded byte array
        responseString = utf8Encoding.GetString(utf8EncodedResponse); // get a useable string out of the response
    }
    catch (Exception e)
    {
        // some other error handling
        responseString = "";// show the basics of the problem
    }
    return responseString;// return whatever ya got
}

这是我得到的错误:

底层连接已关闭:无法为SSL/TLS安全通道建立信任关系.

当请求消失时,我没有太多控制权来查看发生了什么.我被告知它到达了正确的目的地并且出现了"证书错误".这可能是因为我的请求中的IP地址与其解析的URL之间存在字面上的不匹配.我有多个IP,我应该循环使用,因此指定URL将无法正常工作.我没有附上证书 - 我也不应该根据端点所有者的说法.每个"他们"证书错误是'正常的,我应该忽略它.

有问题的证书应该是我们服务器上"正好在那里"的许多verisign证书之一.我看到的忽略证书错误的例子似乎都暗示请求者附加了一个特定的x509证书(我不是).

我查看.net WebService,绕过ssl验证!哪种有点 - 描述我的问题 - 除了它有点 - sorta不是因为我不知道我应该参考哪个证书(如果有的话).

有没有办法让我忽略错误而不实际知道/关心什么证书导致问题?

并请 - 戴上手套,小字和"傻瓜"代码,因为我不是一个沉重的击球手.

这种流量是通过专线进行的 - 所以我的理解是忽略证书错误并不像开放的互联网流量那样大.

MattH.. 56

SSL证书用于机器建立信任关系.如果您键入一个IP地址,并最终与另一个IP地址通话,这听起来与DNS劫持安全性故障相同,那就是SSL打算帮助您避免的事情 - 也许您不想忍受的事情从他们".

如果您最终可能与机器进行交谈(理想情况下,它们会使其显示为一个机器),您将需要为每个可能的机器提供证书以启动信任.

要忽略信任(我只需要在开发方案中暂时执行此操作),以下代码段可能对您有用,但我强烈建议您在使用之前考虑忽略信任的影响:

public static void InitiateSSLTrust()
{
    try
    {
        //Change SSL checks so that all checks pass
        ServicePointManager.ServerCertificateValidationCallback =
           new RemoteCertificateValidationCallback(
                delegate
                { return true; }
            );
    }
    catch (Exception ex)
    {
        ActivityLog.InsertSyncActivity(ex);
    }
}

简而言之,以上代码信任任何人,并绕过所有SSL验证,因此不安全。 (2认同)


Adam Plocher.. 12

我意识到这是一个老帖子,但我只是想表明有更简洁的方法(使用.NET 3.5+及更高版本).

也许这只是我的OCD,但我希望尽可能地减少这些代码.这似乎是最简单的方法,但我还列出了一些更长的等价物:

// 79 Characters (72 without spaces)
ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => true;

.NET 2.0中的最短路径(这个问题是专门询问的)

// 84 Characters
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

不幸的是,lambda方式要求你定义参数,否则它可能更短.

如果你需要更长的路,这里有一些额外的选择:

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

ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; };

// 255 characters - lots of code!
ServicePointManager.ServerCertificateValidationCallback =
    new RemoteCertificateValidationCallback(
        delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true;
        });


Jaxidian.. 9

这有点像我们正在使用的代码(尚未抛光 - 我认为我没有正确的错误处理设置,但它应该接近)基于托马斯的建议(这是.NET 4.0代码):

var sslFailureCallback = new RemoteCertificateValidationCallback(delegate { return true; });

try
{

    if (ignoreSslErrors)
    {
        ServicePointManager.ServerCertificateValidationCallback += sslFailureCallback;
    }

    response = webClient.UploadData(Options.Address, "POST", Encoding.ASCII.GetBytes(Options.PostData));

}
catch (Exception err)
{
    PageSource = "POST Failed:\r\n\r\n" + err;
    return PageSource;
}
finally
{
    if (ignoreSslErrors)
    {
        ServicePointManager.ServerCertificateValidationCallback -= sslFailureCallback;
    }
}


小智.. 8

此代码比您预期的要广泛得多.这是整个过程.该进程可能是此计算机上的exe,IIS,甚至DLLHost.exe.调用它之后,有一个finally块,通过删除总是返回true的委托来恢复正常.



1> MattH..:

SSL证书用于机器建立信任关系.如果您键入一个IP地址,并最终与另一个IP地址通话,这听起来与DNS劫持安全性故障相同,那就是SSL打算帮助您避免的事情 - 也许您不想忍受的事情从他们".

如果您最终可能与机器进行交谈(理想情况下,它们会使其显示为一个机器),您将需要为每个可能的机器提供证书以启动信任.

要忽略信任(我只需要在开发方案中暂时执行此操作),以下代码段可能对您有用,但我强烈建议您在使用之前考虑忽略信任的影响:

public static void InitiateSSLTrust()
{
    try
    {
        //Change SSL checks so that all checks pass
        ServicePointManager.ServerCertificateValidationCallback =
           new RemoteCertificateValidationCallback(
                delegate
                { return true; }
            );
    }
    catch (Exception ex)
    {
        ActivityLog.InsertSyncActivity(ex);
    }
}


简而言之,以上代码信任任何人,并绕过所有SSL验证,因此不安全。

2> Adam Plocher..:

我意识到这是一个老帖子,但我只是想表明有更简洁的方法(使用.NET 3.5+及更高版本).

也许这只是我的OCD,但我希望尽可能地减少这些代码.这似乎是最简单的方法,但我还列出了一些更长的等价物:

// 79 Characters (72 without spaces)
ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => true;

.NET 2.0中的最短路径(这个问题是专门询问的)

// 84 Characters
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

不幸的是,lambda方式要求你定义参数,否则它可能更短.

如果你需要更长的路,这里有一些额外的选择:

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

ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; };

// 255 characters - lots of code!
ServicePointManager.ServerCertificateValidationCallback =
    new RemoteCertificateValidationCallback(
        delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true;
        });



3> Jaxidian..:

这有点像我们正在使用的代码(尚未抛光 - 我认为我没有正确的错误处理设置,但它应该接近)基于托马斯的建议(这是.NET 4.0代码):

var sslFailureCallback = new RemoteCertificateValidationCallback(delegate { return true; });

try
{

    if (ignoreSslErrors)
    {
        ServicePointManager.ServerCertificateValidationCallback += sslFailureCallback;
    }

    response = webClient.UploadData(Options.Address, "POST", Encoding.ASCII.GetBytes(Options.PostData));

}
catch (Exception err)
{
    PageSource = "POST Failed:\r\n\r\n" + err;
    return PageSource;
}
finally
{
    if (ignoreSslErrors)
    {
        ServicePointManager.ServerCertificateValidationCallback -= sslFailureCallback;
    }
}



4> 小智..:

此代码比您预期的要广泛得多.这是整个过程.该进程可能是此计算机上的exe,IIS,甚至DLLHost.exe.调用它之后,有一个finally块,通过删除总是返回true的委托来恢复正常.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有