Как вы проверяете согласованное рукопожатие TLS с сервера? - PullRequest
0 голосов
/ 24 ноября 2018

Если у меня есть дюжина конечных точек, и моя служба WebAPI настроена на TLS 1.1 и TLS 1.2, как я проверяю каждый входящий запрос конечной точки, чтобы увидеть, какая версия была согласована?

Так что, если потребительиз моих конечных точек в настоящее время поддерживает только TLS 1.0 и TLS 1.1, они (очевидно?) договариваются о TLS 1.1 рукопожатии.Но если другой потребитель поддерживает TLS 1.2 и TLS 1.3, он (очевидно?) Договорится о TLS 1.2 рукопожатии.

Я хочу отследить всех своих потребителей, чтобы увидеть, о каких переговорах идет речь.Как мне сделать это по запросу?

1 Ответ

0 голосов
/ 26 ноября 2018

Если вы используете 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 представляет собой шестнадцатеричное число, которое сопоставляется либо с версией защищенного протокола, либо с алгоритмом набора шифров.Для простого текстового запроса HTTP все четыре поля будут зарегистрированы как '-'.

Я снова:

Похоже, что CRYPT_PROTOCOL может быть 400 для TLS1.2, 40 для TLS 1.0, 10 для SSLv3 в текстовых журналах IIS.

Из примеров видно, что в каждом запросе могут быть значения ServerVariable, если вы хотите попытаться включить их внастраиваемые журналы, которые немного проще настроить, чем сам журнал IIS.

Отличный вопрос!и я могу иметь возможность использовать этот ответ сам.


Итак ... похоже, вы МОЖЕТЕ получить ServerVariables из WebAPI, но только неожиданным способом.Смотрите фрагмент ниже.Кажется, если вы перечислите коллекцию или вызовете свойство Keys, все, что вы получите, это некоторое подмножество переменных.Но если вы явно запросите переменные CRYPT_ * перед любым из этих действий, то вы can indeed получите их от своего контроллера.Я пытался сделать это на WebAPI 5.2.6, ориентируясь на .net 4.6.2, работающую под IIS в качестве облачной службы Azure Classic.Я предлагаю попробовать это и посмотреть, работает ли это для вас.Если у вас есть более свежая справка по серверным переменным, отредактируйте этот ответ и замените 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");
     }
  }
...