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

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

是否有办法忽略此错误并继续?

远程证书似乎没有签名。

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


当前回答

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

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

其他回答

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

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

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

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

老了,但仍然有用……

实现相同行为的另一个好方法是通过配置文件(web.config)

 <system.net>
    <settings>
      <servicePointManager checkCertificateName="false" checkCertificateRevocationList="false" />
    </settings>
  </system.net>

注意:测试在。net full上。

为了进一步扩展bigignum的帖子-理想情况下,您需要一个解决方案,可以模拟您在生产中看到的条件,修改您的代码不会做到这一点,如果您忘记在部署之前将代码取出,则可能会带来危险。

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

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

现在,您的计算机作为一个整体将隐式地信任它自己生成的任何证书,您不需要添加代码来专门处理这一点。当您转移到生产环境时,它将继续工作,前提是您在那里安装了适当的有效证书。不要在生产服务器上这样做——那样会很糟糕,而且除了服务器上的客户端之外,它对任何其他客户端都不起作用。

这个代码对我有用。我必须添加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);
}