【问题标题】:How do you check the Negotiated TLS Handshake from the Server?如何从服务器检查协商的 TLS 握手?
【发布时间】:2019-04-26 22:45:46
【问题描述】:

如果我有十几个端点,并且我的 WebAPI 服务配置为 TLS 1.1TLS 1.2,我如何检查每个传入的端点请求以查看协商的版本?

因此,如果我的端点的消费者当前仅支持 TLS 1.0TLS 1.1,他们将(显然?)协商 TLS 1.1 握手。但如果不同的消费者支持TLS 1.2TLS 1.3,他们会(显然?)协商TLS 1.2 握手。

我想跟踪我的所有消费者,以了解正在协商哪些握手。如何按请求执行该操作?

【问题讨论】:

  • 我在这里发布了一些关于这件事的信息:Which TLS version was negotiated?。当然,这适用于世界的客户端,我不确定它在这里是否有用。但也许你能在笔记中发现一些有趣的东西。
  • @Jimi 很棒的信息。那里有一些关键术语可能会导致某些事情,但额外的搜索并没有产生任何实质性的结果。我确信我会在我的研究中更多地使用它,但就目前而言,它是非常片面的。 :)
  • 根据This similar Question and Answer,我的问题非常接近重复,答案是你不能。我希望有人过来说其他话,或者甚至在 .NET CORE 中。但即使这样看起来也是一个响亮的 No. Boooo。
  • 嗯,你是对的。这是高层网络/Ssl 流的托管实现中真正缺少的东西(TCP 知道一切)。在双方。无论如何,由于我仍在密切关注此事,因此我正在为您的问题添加书签,如果出现问题,我会通知您。
  • 不是一个很好的答案,但是......如果您可以支持多个端点,您可以单独配置它们。为什么要知道正在使用哪个版本的 TLS?似乎您会记录您的安全要求并根据您的业务需求在必要时对其进行更新。

标签: c# asp.net-mvc ssl asp.net-web-api tls1.2


【解决方案1】:

如果您使用的是 IIS,您似乎可以在 IIS 日志中添加一些扩展日志记录。

https://cloudblogs.microsoft.com/microsoftsecure/2017/09/07/new-iis-functionality-to-help-identify-weak-tls-usage/

抄袭……呃……引用后代:

要启用这个新功能,这四个服务器变量需要 配置为 IIS 中自定义字段的来源 应用程序主机配置。自定义日志记录可以在任何一个上配置 服务器级别或站点级别。这是一个站点级配置示例:

<site name="Default Web Site" id="1" serverAutoStart="true">
 <application path="/">
 <virtualDirectory path="/" physicalPath="C:\inetpub\wwwroot" />
 </application>
 <bindings>
 <binding protocol="https" bindingInformation="*:443:" />
 </bindings>
 <logFile>
 <customFields>
 <clear />
<add logFieldName="crypt-protocol" sourceName="CRYPT_PROTOCOL" sourceType="ServerVariable" />
<add logFieldName="crypt-cipher" sourceName="CRYPT_CIPHER_ALG_ID" sourceType="ServerVariable" />
<add logFieldName="crypt-hash" sourceName="CRYPT_HASH_ALG_ID" sourceType="ServerVariable" />
<add logFieldName="crypt-keyexchange" sourceName="CRYPT_KEYEXCHANGE_ALG_ID" sourceType="ServerVariable" />
 </customFields>
 </logFile>
 </site>

每个 SSL 信息字段都是一个十六进制数字,映射到 安全协议版本或密码套件算法。对于 HTTP 纯文本请求,所有四个字段都将记录为“-”。

又是我:

在 IIS 文本日志中,CRYPT_PROTOCOL 似乎可以是 TLS1.2 的 400、TLS 1.0 的 40、SSLv3 的 10

从示例中,如果您想尝试在自定义日志中包含比 IIS 日志本身更容易自定义的自定义日志,那么每个请求上可能都有 ServerVariable 值。

好问题!我可能有机会自己使用这个答案。


所以...看起来您可以从 WebAPI 获取 ServerVariables,但只能以一种意想不到的方式。请参阅下面的 sn-p。似乎如果您枚举集合或调用 Keys 属性,您得到的只是变量的一些子集。但是,如果您在任何这些操作之前明确请求 CRYPT_* 变量,那么您 can indeed 从您的控制器中获取它们。我在针对在 IIS 下作为 Azure 经典云服务运行的 .net 4.6.2 的 WebAPI 5.2.6 上进行了尝试。我建议尝试一下,看看它是否适合你。如果您有服务器变量的更新参考,请编辑此答案并将https://docs.microsoft.com/en-us/iis/web-dev-reference/server-variables 替换为您的链接。

以下为我列出的环境的写作日期工作。将来可能会改变。对于生产,我肯定会将其移至辅助方法中。

if (Request.Properties.TryGetValue("MS_HttpContext", out object context))
 {
 if (context is HttpContextWrapper wrapper)
  {
  var v = wrapper.Request?.ServerVariables;
  if (v != null)
   {
   var headers = response.Headers;
   const string CRYPT_PROTOCOL = nameof(CRYPT_PROTOCOL);
   try
    {
    headers.Add($"SV_{CRYPT_PROTOCOL}", $"[{v[CRYPT_PROTOCOL].Replace("\r", "0x0D").Replace("\n", "0x0A")}]");
    }
    catch (Exception ex)
    {
       headers.Add($"SV_{CRYPT_PROTOCOL}", ex.Message);
    }
    foreach (string key in v.AllKeys)
      {
      headers.Add($"SV_{key}", v[key].Replace("\r", "0x0D").Replace("\n", "0x0A"));
      }
     headers.Add($"SV_DONE", "All Server Variables Replaced");
     }
  }

【讨论】:

  • 你的回答绝对教会了我一些我不知道的东西。我不得不说我故意没有提到 Azure,因为我同时使用了 Azure 和托管服务器。虽然我真的想要一个可以在 ASP.NET Web API 中为我提供信息的答案,但将它放在 IIS 日志中并不是最糟糕的事情。这只是意味着我在通话期间无法实时访问此信息;无论如何,这可能无关紧要。所以我喜欢这个答案的去向,它基本上回答了这个问题,但它并没有立即帮助我,这让我很难过。另外,我喜欢你的对话形式,哈哈。
  • 我正在调查文章中提到的 ServerVariables 是否在 WebAPI 中可用。我能够在本地找到它们,但我怀疑 IIS Express 是否在做 IIS 正在做的所有事情。随意尝试一下。我刚刚获得了一项服务来记录所有 ServerVariable 值,以查看生产服务器上针对 Internet 请求显示的内容。
  • 是的,这很有趣。我需要对其进行测试(主要是因为我想知道我是否有这些值——这些数字是从哪里来的?)。如果@Suamere 接受这个答案,我会在我更新时链接它(TLS1.3 现已启动,FW 4.7.2 对 SSL 协议管理进行了一些更改,目前在 HttpClient 类中)。
  • 我将在接下来的几天内测试它,因为我会更新我的一些微服务。我当前的客户端使用 Azure AppServices,所以这可能会影响事情。如果@Jimi 或我自己说它在我们的任何一个环境中都有效,我会将此标记为答案。无论哪种方式,绝对是对一个了不起的发现的赞成票。
  • @Jimi 如果您点击此链接并查看特定的 CRYPT_* 服务器变量描述,则有指向 IIS 枚举和值的链接。 docs.microsoft.com/en-us/iis/web-dev-reference/server-variables
猜你喜欢
  • 2020-10-11
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 2016-09-25
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多