代码之家  ›  专栏  ›  技术社区  ›  Suamere

如何检查来自服务器的协商TLS握手?

  •  3
  • Suamere  · 技术社区  · 6 年前

    如果我有十几个端点,并且我的WebAPI服务配置为 TLS 1.1 TLS 1.2

    因此,如果我的端点的使用者当前只支持 TLS 1.0 TLS 1.1级 ,他们会(显然?)谈判 握手。但如果另一个消费者支持 TLS 1.2级 TLS 1.3 TLS 1.2级

    1 回复  |  直到 6 年前
        1
  •  6
  •   No Refunds No Returns    6 年前

    如果您使用的是IIS,看起来可以向IIS日志中添加一些扩展日志。

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

    要启用这个新功能,这四个服务器变量需要 配置为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 info字段都是一个十六进制数,映射到 纯文本请求,所有四个字段都将记录为-。

    再次提醒我:

    看起来像 CRYPT_PROTOCOL 400 对于TLS1.2, 40 对于TLS 1.0, 10 用于IIS文本日志中的SSLv3。

    从示例中可以看出,如果要尝试在自定义日志中包含比IIS日志本身更易于自定义的ServerVariable值,则每个请求上可能都有ServerVariable值。

    好问题!我也许有机会用这个答案。


    所以。。。看起来您可以从WebAPI获取ServerVariables,但只能以意外的方式获取。请参见下面的片段。如果您枚举集合或调用Keys属性,您得到的似乎只是一些变量子集。但是,如果您在这些操作之前显式请求CRYPT变量,那么 can indeed 从你的控制器那里得到它们。我在WebAPI 5.2.6上尝试了这个,目标是在IIS下运行的.net4.6.2作为Azure经典云服务。我建议你试试这个,看看是否对你有用。如果您对服务器变量有较新的引用,请编辑此答案并替换 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");
         }
      }