SSL-рукопожатие + WCF + ведение журнала

У меня есть служба wcf, использующая протокол https. Я использую сертификаты для аутентификации клиентов, а также для обеспечения безопасности на транспортном уровне.

Я хотел бы знать, есть ли способ зарегистрировать детали рукопожатия, которое происходит за сценой. В настоящее время я регистрирую сведения о сертификате, который отправляет клиент (используя пользовательский валидатор сертификатов). Но он используется только для аутентификации клиента.

Я хотел бы записать, что происходит за кулисами. Я видел в нескольких местах, где они используют netmon для просмотра данных, связанных с рукопожатием. Есть ли способ регистрировать данные в каком-либо формате, в случае службы WCF, которая просто сообщает о произошедшем рукопожатии.

Я разместил свою службу WCF, используя службу Windows.

Благодарность


person Sandepku    schedule 24.04.2013    source источник


Ответы (2)


Вы можете быть хорошо обслужены с помощью пользовательского трассировщика:

Ваш собственный класс трассировщика:

using System.Diagnostics;

namespace MambaBase.Utils
{
    public class TraceLogger : TraceListener
    {
        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
#if EXTENDED_DEBUG
        private string s(object payload)
        {
            try
            {
                return Newtonsoft.Json.JsonConvert.SerializeObject(payload, new Newtonsoft.Json.JsonSerializerSettings() { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore });
            }
            catch (Exception)
            {
                return "°°°";
            }
        }
        public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, object data)
        {
            if (log.IsDebugEnabled) log.Debug("eventCache:" + s(eventCache) + " / source:" + s(source) + " / eventType:" + s(eventType) + " / Id:" + id + " / data:" + s(data));
            base.TraceData(eventCache, source, eventType, id, data);
        }

        public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, params object[] data)
        {
            if (log.IsDebugEnabled) log.Debug("eventCache:" + s(eventCache) + " / source:" + s(source) + " / eventType:" + s(eventType) + " / Id:" + id + " / data:" + s(data));
            base.TraceData(eventCache, source, eventType, id, data);
        }

        public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id)
        {
            if (log.IsDebugEnabled) log.Debug("eventCache:" + s(eventCache) + " / source:" + s(source) + " / eventType:" + s(eventType) + " / Id:" + id );
            base.TraceEvent(eventCache, source, eventType, id);
        }
        public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string format, params object[] args)
        {
            if (log.IsDebugEnabled) log.Debug("eventCache:" + s(eventCache) + " / source:" + s(source) + " / eventType:" + s(eventType) + " / Id:" + id + " / format:" + format + " / args:" + s(args));
            base.TraceEvent(eventCache, source, eventType, id, format, args);
        }

        public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string message)
        {
            if (log.IsDebugEnabled) log.Debug("eventCache:" + s(eventCache) + " / source:" + s(source) + " / eventType:" + s(eventType) + " / Id:" + id + " / message:" + message);
            base.TraceEvent(eventCache, source, eventType, id, message);
        }

        public override void TraceTransfer(TraceEventCache eventCache, string source, int id, string message, Guid relatedActivityId)
        {
            if (log.IsDebugEnabled) log.Debug("eventCache:" + s(eventCache) + " / source:" + s(source) + " / Id:" + id + " / message:" + message + " / relatedActivityId:" + relatedActivityId.ToString());
            base.TraceTransfer(eventCache, source, id, message, relatedActivityId);
        }
        public override void Fail(string message)
        {
            if (log.IsDebugEnabled) log.Debug("Fail - message:" + message);
            base.Fail(message);
        }

        public override void WriteLine(object o)
        {
            if (log.IsDebugEnabled) log.Debug("Trace:" + s(o));
            base.WriteLine(o);
        }
        public override void Write(object o, string category)
        {
            if (log.IsDebugEnabled) log.Debug("Trace:" + s(o) + " / category:" + category);
            base.Write(o, category);
        }
        public override void Write(string message, string category)
        {
            if (log.IsDebugEnabled) log.Debug("Trace:" + message + " / category:" + category);
            base.Write(message, category);
        }

        public override void WriteLine(object o, string category)
        {
            if (log.IsDebugEnabled) log.Debug("Trace:" + s(o) + " / category:" + category);
            base.WriteLine(o, category);
        }

        public override void Write(object o)
        {
            if (log.IsDebugEnabled) log.Debug("Trace:" + s(o) );
            base.Write(o);
        }

        public override void WriteLine(string message, string category)
        {
            if (log.IsDebugEnabled) log.Debug("Trace:" + message + " / category:" + category);
            base.WriteLine(message, category);
        }

#endif
        public override void Write(string message)
        {
#if EXTENDED_DEBUG
            if (log.IsDebugEnabled) log.Debug("Trace:" + message);
            Debug.Write(message);
#endif
        }
        public override void WriteLine(string message)
        {
            if (log.IsDebugEnabled) log.Debug("Trace ==> " + message);
            Debug.WriteLine(message);
        }
    }
}

В файле web.config или app.config вашего приложения:

  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
        <listeners><add name="CustomTracer"/></listeners>
      </source>
      <source name="System.ServiceModel.MessageLogging">
        <listeners><add name="CustomTracer"/></listeners>
      </source>
      <source name="System.Net">
        <listeners><add name="CustomTracer"/></listeners>
      </source>
      <source name="System.Net.Sockets">
        <listeners><add name="CustomTracer"/></listeners>
      </source>
      <source name="System.Net.Cache">
        <listeners><add name="CustomTracer"/></listeners>
      </source>
      <source name="System.Net.Security">
        <listeners><add name="CustomTracer"/></listeners>
      </source>
      <source name="System.Security">
        <listeners><add name="CustomTracer"/></listeners>
      </source>
    </sources>
    <switches>
      <add name="System.ServiceModel" value="Verbose"/>
      <add name="System.ServiceModel.MessageLogging" value="Verbose"/>
      <add name="System.Net" value="Verbose"/>
      <add name="System.Net.Sockets" value="Verbose"/>
      <add name="System.Net.Cache" value="Verbose"/>
      <add name="System.Security" value="Verbose"/>
      <add name="System.Net.Security" value="Verbose"/>
    </switches>
    <sharedListeners>
      <add name="CustomTracer" type="MambaBase.Utils.TraceLogger, MambaBase" />
    </sharedListeners>
    <trace autoflush="true"/>
  </system.diagnostics>

  <system.serviceModel>
    <diagnostics performanceCounters="All" wmiProviderEnabled="true">
      <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="100000" />
    </diagnostics>
  </system.serviceModel>

Излишне говорить, что это приведет к большому количеству журналов, особенно если вы активируете EXTENDED_DEBUG.

И журналы будут содержать конфиденциальные данные, такие как пароли.

person Wolfgang Grinfeld    schedule 13.03.2019

Лучше всего использовать графический инструмент: посмотрите на аналогичный путь: C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools

Найдите SvcConfigEditor.exe.

Откройте с его помощью файл web.config, и теперь вы можете легко добавить диагностику, в том числе то, что вы просили.

person alexrait    schedule 17.03.2019