it-roy-ru.com

Как вы проверяете согласованное рукопожатие TLS с сервера?

Если у меня есть дюжина конечных точек, и моя служба 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.

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

3
Suamere

Если вы используете 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. Я предлагаю попробовать это и посмотреть, работает ли это для вас. Если у вас есть более свежая ссылка на серверные переменные, отредактируйте этот ответ и замените 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");
     }
  }
1
No Refunds No Returns