如何从服务器检查TLS握手协议?

时间:2018-11-24 19:25:28

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

如果我有十二个端点,并且我的WebAPI服务配置为<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <textarea class="inbox_message_textarea"></textarea>TLS 1.1,如何检查每个传入的端点请求以查看协商了哪个版本?

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

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

1 个答案:

答案 0 :(得分:1)

如果您使用的是IIS,则可以将一些扩展日志记录添加到IIS日志中。

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

pla窃... er ...引用后代:

  

要启用此新功能,这四个服务器变量需要   被配置为IIS中自定义字段的源   applicationHost.config。可以在以下任一位置配置自定义日志记录   服务器级别或站点级别。这是一个示例站点级配置:

<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文本日志中,对于TLS1.2,CRYPT_PROTOCOL可能是400,对于TLS 1.0可能是40,对于SSLv3,可能是10

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

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


所以...看来您可以从WebAPI获取ServerVariables,但只是以一种意外的方式。请参见下面的代码段。看来,如果枚举集合或调用Keys属性,您得到的仅仅是变量的一些子集。但是,如果您在任何这些操作之前明确请求CRYPT_ *变量,则可以can indeed从控制器中获取它们。我在WebAPI 5.2.6上对此进行了尝试,该WebAPI定位在IIS下作为Azure经典云服务运行的.net 4.6.2。我建议尝试一下,看看是否适合您。如果您有关于服务器变量的最新参考,请编辑此答案,并用链接替换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");
     }
  }