【问题标题】:SSL Handshake exception for HTTP Get method - ASP.NET core 2.1HTTP Get 方法的 SSL 握手异常 - ASP.NET core 2.1
【发布时间】:2019-03-28 14:49:37
【问题描述】:

我正在尝试使用 asp.net core 2.1 调用 rest 方法,但即使我在此调用中使用 http,也会不断收到 ssl 异常。我使用的代码是:

public async Task<bool> SyncTickets()
    {
        try
        {
            HttpClient client = new HttpClient();
            var path = "http://testdesk.vmw.be:8082/helpdesk/WebObjects/Helpdesk.woa/ra/PriorityTypes?username=admin&apiKey=bJZw2jP8wgtyGXI736K6DfUiEjJYTLuqC8fGuOBN";
            Ticket ticket = new Ticket();
            HttpResponseMessage response = await client.GetAsync(path);
            if (response.IsSuccessStatusCode)
            {
                var responseMsg = await response.Content.ReadAsAsync<Object>();
                return true;
            }
            return false; 

        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
            return false;
        }

例外是:

{System.Net.Http.HttpRequestException:无法建立 SSL 连接,请参阅内部异常。 ---> System.IO.IOException: 由于意外的数据包格式,握手失败

GetAsync 方法发生异常。 当我使用相同的路径通过邮递员或浏览器进行测试时,它工作得非常好,我得到了响应。

知道我在这里缺少什么吗?

【问题讨论】:

    标签: c# asp.net .net asp.net-core asp.net-core-2.1


    【解决方案1】:

    也许您的服务器无论如何都需要加密并重定向到 https?

    如果是这种情况并且 https 仍然报告在创建 HttpClient 之前添加:

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

    这将接受所有证书。 此设置对您的应用来说是全局的。不要在生产中使用它。 如果您的服务器使用自签名证书或内部 CA 颁发的证书,则仅将其用于测试。 在生产中添加对内部 CA 的适当验证或仅接受特定的自签名证书。浏览器可能会从域控制器或通过组策略在 PC 上添加内部证书或 CA,因此它们不会报告它们不受信任。

    此外,对于 https,您可以显式使用 TLS 协议。在创建 HttpClient 之前添加以下行并重试:

    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
    

    如果您在服务器上定义了协议集,您可以缩小协议列表以启用那些实际支持的协议。

    【讨论】:

      猜你喜欢
      • 2011-04-16
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-24
      • 2018-04-08
      相关资源
      最近更新 更多