【问题标题】:Only on azure: Could not create SSL/TLS secure channel仅在 azure 上:无法创建 SSL/TLS 安全通道
【发布时间】:2016-11-18 11:25:25
【问题描述】:

我在 Azure 应用程序 Standard: 1 Small plan 上运行应用程序。框架是4.6.1

此应用程序正在调用 SSL 安全 API。 SSL 由 StartCom Class 1 DV Server CA 发布,我的本地浏览器告诉我证书有效。

如果我在本地机器上运行应用程序,一切正常。但是,当部署到天蓝色时,它会失败并出现以下错误:

System.Net.Http.HttpRequestException:发送时出错 请求。 ---> System.Net.WebException:请求被中止: 无法创建 SSL/TLS 安全通道。

在 System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)

在 System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)

---内部异常堆栈跟踪结束---

在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)

在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)

代码:

public async Task<List<QutationOverview>> GetAll(string url, DateTime lastActionDate)
    {
        var result = string.Empty;

        try
        {


            var userName = await _settingManager.GetSettingValueAsync("API.UserName");
            var password = await _settingManager.GetSettingValueAsync("API.Password");


            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls |
                                                   SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;


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


            //Add date filter
            //Always request qutations where the last action took place >= Yesterday
            var requestUrl =
                $"GetALL/?last_action_date={lastActionDate.AddDays(-1).ToString("yyyy-MM-dd")}&format=json";


            var baseAddress = new Uri(url);
            var credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{userName}:{password}"));

            Logger.InfoFormat("GetAllQuotationsAsync for url {0}{1}", url, requestUrl);

            using (var httpClient = new HttpClient {BaseAddress = baseAddress})
            {
                httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", credentials);
                using (var response = await httpClient.GetAsync(requestUrl))
                {
                    result = await response.Content.ReadAsStringAsync();
                    Logger.Info(result);
                }
            }
        }

        catch (Exception ex)
        {
            Logger.ErrorFormat("GetAllQuotationsAsync {0}: {1}", url, ex);
        }
        var data = JsonConvert.DeserializeObject<List<QutationOverview>>(result);

        return data;
    }

如您所见,我跳过了证书验证并添加了安全协议。

但是,请求仍然失败。


这是捕获的响应 http://textuploader.com/5ers0


你知道如何让这个在 Azure 上运行吗?

【问题讨论】:

标签: c# azure ssl


【解决方案1】:

捕获 TLS 握手。如果您的 ServerHello 丢失,您很可能没有与遥控器通用的密码套件。

通过https://www.ssllabs.com/ssltest/ 来检查两端支持的密码套件。对于 Windows Server,密码套件只能在全局范围内启用或禁用(客户端/服务器组件之间没有区别),因此这是一个很好的测试。

更新:在我的推理中发现了一个明显的问题,应用服务有一个前端层,这是 TLS 终止的地方,因此以这种方式比较密码无济于事。

改为运行

Get-TlsCipherSuite

来自 Kudu 的 PowerShell,并将密码与您的远程 API 进行比较(您可以在 https://ssllabs.com/ssltest 查看密码)。你应该至少有一场比赛。

如果不匹配,您需要切换到云服务或虚拟机,并至少启用您的遥控器使用的密码套件之一。必须朝这个方向发展通常意味着一件事——您的遥控器使用的是弱加密(SSL 3.0 或 TLS 1.0 和 RC4),您应该与这些公民聊天,或者找到使用 TLS 1.2 的新公民。

来自您的 System.Net 跟踪:

[8356] 00000000 : 15 03 03 00 02

这是Fatal Handshake Error 的字节序列,它建立在我的no common cipher理论之上。

注意第一个字节(0x15):

 Record Type Values       dec      hex
 -------------------------------------
 CHANGE_CIPHER_SPEC        20     0x14
 ALERT                     21     0x15
 HANDSHAKE                 22     0x16
 APPLICATION_DATA          23     0x17

【讨论】:

  • 谢谢,我删除了 ServicePointManager .ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;并添加了 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;。但是,错误仍然是一样的
  • 嗯.. 使用最近的 curl--tlsv1.x 并检查遥控器是否真的支持 TLS 1.2:curl.haxx.se/docs/manpage.html#--tlsv10。尝试捕获 TLS 握手 ClientHello + ServerHello(Wireshark 或 System.Net 跟踪),在此处发布,这应该有助于找到根本原因。
  • 我在主帖中附上了wireshark的回复。那有帮助吗?
  • 您的捕获显示 TLS 握手非常成功。可能是ServerHello之后发生了一些不好的事情,你的截图提前截断了。
  • 好的,我添加了第二个。但是,在我的本地开发机器上,应用程序运行没有任何问题。当我将它部署到无法使用wireshark的天蓝色网络应用程序时,我只会收到错误..
【解决方案2】:

我在 Azure 的应用服务上托管客户端证书时遇到了这个错误。解决方法是在应用设置中设置 WEBSITE_LOAD_CERTIFICATES。

您可以将其设置为“*”以允许所有证书,或者您可以定义特定的证书指纹以允许。 See more info here.

【讨论】:

  • 我很想理解这一点,但它也对我有用。我刚刚删除了这条线,因为我切换到 MSI 并且不需要加载证书,但如果我没有看到这个答案,我永远不会连接这些点。
猜你喜欢
  • 2015-08-11
  • 2019-08-12
  • 2020-05-15
  • 2021-12-13
  • 2014-12-26
  • 2017-02-10
  • 2017-08-22
  • 2016-08-03
  • 2018-06-17
相关资源
最近更新 更多