CAPI2-Debugging

CAPI2 hat nicht mit der ISDN-CAPI zu tun, sondern beschreibt die CryptoAPI 2.0, auf der die SSL/TLS-Verbindungen von Windows basieren. Wenn immer ein Client oder Server eine Verbindung per TLS aufbaut oder annimmt ist die CAPI2 mit im Boot. Wenn die Applikation aber keine Fehlermeldung ausgibt, dann sind Protokollfehler oder Probleme mit dem Zertifikat nur schwer zu finden. CAPI2-Debugging kann hier weiter helfen ist zudem ein praktisches Beispiel der erweiterten Protokollfunktionen von Windows im EventViewer.

Schannel ist nicht genug

Vielleicht haben Sie im System-Eventlog schon Fehlermeldungen von "SCHANNEL" gefunden, die aber nicht immer viel aussagen.

Es gibt sehr viele Treffer, wenn Sie nach Schannel und die Fehlernummer suchen, aber meist keine qualifizierte Fehlersuche sondern viele Hinweise, wie man bestimmte TLS-Versionen im Internet Explorer abschaltet oder Einstellungen von Schannel schwächt mit der Hoffnung auf Abhilfe. Besser wäre es aber die Ursache zu finden und dann zu überlegen, was der richtige und sichere Weg zur Korrektur ist. Schließlich möchten Sie mit Verschlüsselung ja etwas erreichen.

Aktivieren von CAPI2 Debugging

Zuerst müssen Sie den klassischen EventViewer (Eventvwr.exe) starten und unter "Application and Service Log/Microsoft/Windows/CAPI2" das Logging aktivieren

Dann dauert es ein paar Sekunden und das Eventlog füllt sich mit Einträgen.

In der Beschreibung zum Event ist leider fast nie etwas zu sehen. Sie müssen den Event also schon öffnen und dann über Details die XML-Ansicht nutzen:

Meist steht der Fehler ziemlich weit unten. Ich kopiere den Inhalt daher über die Zwischenablage in einen Editor meiner Wahl um dort einen besseren Überblick zu erhalten.

Wichtiger Hinweis
Dies ist eine temporäre Option zum Suchen von Fehlern, die zusätzliche Ressourcen fordert. Vergessen Sie also nicht am Ende ihrer Fehlersuche das Logging wieder abzuschalten.

Beispiele

Vielleicht funktioniert bei ihnen ja alles. Dann werden Sie in der Regel keine Fehler finden. Hier sind zwei Logs als Beispiel.

Log Name:      Microsoft-Windows-CAPI2/Operational
Source:        Microsoft-Windows-CAPI2
Event ID:      11
Task Category: Build Chain
Level:         Error
Keywords:      Path Discovery,Path Validation
Computer:      fe2.msxfaq.net
Description: für more details für this event, please refer to the "Details" section
Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Microsoft-Windows-CAPI2" Guid="{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" />
    <EventID>11</EventID>
    <Version>0</Version>
    <Level>2</Level>
    <Task>11</Task>
    <Opcode>2</Opcode>
    <Keywords>0x4000000000000003</Keywords>
    <TimeCreated SystemTime="2013-01-13T09:32:45.228804600Z" />
    <EventRecordID>4</EventRecordID>
    <Correlation />
    <Execution ProcessID="1192" ThreadID="1384" />
    <Channel>Microsoft-Windows-CAPI2/Operational</Channel>
    <Computer>fe2.msxfaq.net</Computer>
    <Security UserID="S-1-5-21-1614895754-1454471165-682003330-826" />
  </System>
  <UserData>
    <CertGetCertificateChain>
      <Certificate fileRef="C9231E0C550F956D32EADD6E731A173831F345FF.cer" subjectName="Microsoft Time-Stamp Service" />
      <AdditionalStore>
        <Certificate fileRef="580A6F4CC4E4B669B9EBDC1B2B3E087B80D0678D.cer" subjectName="Microsoft Windows Production PCA 2011" />
        <Certificate fileRef="7DE47E2554CE16104732642B874FE89C32591FBE.cer" subjectName="Microsoft Windows" />
        <Certificate fileRef="C9231E0C550F956D32EADD6E731A173831F345FF.cer" subjectName="Microsoft Time-Stamp Service" />
        <Certificate fileRef="2AA752FE64C49ABE82913C463529CF10FF2F04EE.cer" subjectName="Microsoft Time-Stamp PCA 2010" />
      </AdditionalStore>
      <ExtendedKeyUsage />
      <Flags value="4" CERT_CHAIN_CACHE_ONLY_URL_RETRIEVAL="true" />
      <ChainEngineInfo context="User" />
      <CertificateChain chainRef="{450CD1F1-664B-4394-A7F1-58A0CD193090}">
        <TrustStatus>
          <ErrorStatus value="1" CERT_TRUST_IS_NOT_TIME_VALID="true" />
          <InfoStatus value="100" CERT_TRUST_HAS_PREFERRED_ISSUER="true" />
        </TrustStatus>
        <ChainElement>
          <Certificate fileRef="C9231E0C550F956D32EADD6E731A173831F345FF.cer" subjectName="Microsoft Time-Stamp Service" />
          <SignatureAlgorithm oid="1.2.840.113549.1.1.11" hashName="SHA256" publicKeyName="RSA" />
          <PublicKeyAlgorithm oid="1.2.840.113549.1.1.1" publicKeyName="RSA" publicKeyLength="2048" />
          <TrustStatus>
            <ErrorStatus value="1" CERT_TRUST_IS_NOT_TIME_VALID="true" />
            <InfoStatus value="102" CERT_TRUST_HAS_KEY_MATCH_ISSUER="true" CERT_TRUST_HAS_PREFERRED_ISSUER="true" />
          </TrustStatus>
          <ApplicationUsage>
            <Usage oid="1.3.6.1.5.5.7.3.8" name="Time Stamping" />
          </ApplicationUsage>
          <IssuanceUsage />
        </ChainElement>
        <ChainElement>
          <Certificate fileRef="2AA752FE64C49ABE82913C463529CF10FF2F04EE.cer" subjectName="Microsoft Time-Stamp PCA 2010" />
          <SignatureAlgorithm oid="1.2.840.113549.1.1.11" hashName="SHA256" publicKeyName="RSA" />
          <PublicKeyAlgorithm oid="1.2.840.113549.1.1.1" publicKeyName="RSA" publicKeyLength="2048" />
          <TrustStatus>
            <ErrorStatus value="0" />
            <InfoStatus value="102" CERT_TRUST_HAS_KEY_MATCH_ISSUER="true" CERT_TRUST_HAS_PREFERRED_ISSUER="true" />
          </TrustStatus>
          <ApplicationUsage any="true" />
          <IssuanceUsage>
            <Usage oid="1.3.6.1.4.1.311.46.3" />
          </IssuanceUsage>
        </ChainElement>
        <ChainElement>
          <Certificate fileRef="3B1EFD3A66EA28B16697394703A72CA340A05BD5.cer" subjectName="Microsoft Root Certificate Authority 2010" />
          <SignatureAlgorithm oid="1.2.840.113549.1.1.11" hashName="SHA256" publicKeyName="RSA" />
          <PublicKeyAlgorithm oid="1.2.840.113549.1.1.1" publicKeyName="RSA" publicKeyLength="4096" />
          <TrustStatus>
            <ErrorStatus value="0" />
            <InfoStatus value="13C" CERT_TRUST_HAS_NAME_MATCH_ISSUER="true" 
                                    CERT_TRUST_IS_SELF_SIGNED="true" 
                                    CERT_TRUST_AUTO_UPDATE_CA_REVOCATION="true" 
                                    CERT_TRUST_AUTO_UPDATE_END_REVOCATION="true" 
                                    CERT_TRUST_HAS_PREFERRED_ISSUER="true" />
          </TrustStatus>
          <ApplicationUsage any="true" />
          <IssuanceUsage any="true" />
        </ChainElement>
      </CertificateChain>
      <EventAuxInfo ProcessName="consent.exe" impersonateToken="S-1-5-21-1454471165-1614895754-682003330-82066" />
      <CorrelationAuxInfo TaskId="{9F06EC07-A318-479E-B10C-8148D8F2F336}" SeqNumber="3" />
      <Result value="800B0101">A required certificate is not within its validity period when verifying against the current system clock or the timestamp in the signed file.</Result>
    </CertGetCertificateChain>
  </UserData>
</Event>

Interessant ist hier die Meldung am Ende, die sagt: "<Result value="800B0101">A required certificate is not within its validity period when verifying against the current system clock or the timestamp in the signed file.</Result>".

Log Name:      Microsoft-Windows-CAPI2/Operational
Source:        Microsoft-Windows-CAPI2
Event ID:      30
Task Category: Verify Chain Policy
Level:         Error
Keywords:      Path Validation User:          NETWORK SERVICE
Computer:      fe2.msxfaq.net
Description: für more details für this event, please refer to the "Details" section
Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Microsoft-Windows-CAPI2" Guid="{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" />
    <EventID>30</EventID>
    <Version>0</Version>
    <Level>2</Level>
    <Task>30</Task>
    <Opcode>0</Opcode>
    <Keywords>0x4000000000000001</Keywords>
    <TimeCreated SystemTime="2013-01-13T09:34:43.285446000Z" />
    <EventRecordID>78</EventRecordID>
    <Correlation />
    <Execution ProcessID="236" ThreadID="384" />
    <Channel>Microsoft-Windows-CAPI2/Operational</Channel>
    <Computer>fe2.msxfaq.net</Computer>
    <Security UserID="S-1-5-20" />
  </System>
  <UserData>
    <CertVerifyCertificateChainPolicy>
      <Policy type="CERT_CHAIN_POLICY_SSL" constant="4" />
      <Certificate fileRef="xxxxxxxxxxxxxxxx.cer" subjectName="lyncpool.msxfaq.net" />
      <CertificateChain chainRef="{xxxxxxxxx}">
        <TrustStatus>
          <ErrorStatus value="0" />
          <InfoStatus value="0" />
        </TrustStatus>
        <ChainElement>
          <Certificate fileRef="xxxxxxxxxxxxxxxx.cer" subjectName="lyncpool.msxfaq.net" />
          <SignatureAlgorithm oid="1.2.840.113549.1.1.5" hashName="SHA1" publicKeyName="RSA" />
          <PublicKeyAlgorithm oid="1.2.840.113549.1.1.1" publicKeyName="RSA" publicKeyLength="2048" />
          <TrustStatus>
            <ErrorStatus value="0" />
            <InfoStatus value="0" />
          </TrustStatus>
          <ApplicationUsage any="true" />
          <IssuanceUsage any="true" />
        </ChainElement>
      </CertificateChain>
      <Flags value="0" />
      <SSLAdditionalPolicyInfo authType="server" serverName="dbserver.msxfaq.net">
        <IgnoreFlags value="2280" SECURITY_FLAG_IGNORE_REVOCATION="true"
                                  SECURITY_FLAG_IGNORE_WRONG_USAGE="true"
                                  SECURITY_FLAG_IGNORE_CERT_DATE_INVALID="true" />
      </SSLAdditionalPolicyInfo>
      <Status chainIndex="0" elementIndex="0" />
      <EventAuxInfo ProcessName="RtcHost.exe" />
      <CorrelationAuxInfo TaskId="{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" SeqNumber="2" />
      <Result value="800B010F">The certificate's CN name does not match the passed value.</Result>
    </CertVerifyCertificateChainPolicy>
  </UserData>
</Event>

Hier ist auch wieder das "Result" der wichtig Hinweis, dass der Name im Zertifikat mit dem gewünschten Ziel nicht übereinstimmt. Ich habe ihnen "Rot" den angefragten Server markiert und in Grün der Name, der im gelieferten Zertifikat enthalten ist. Da wollte mein Server also eine TLS-Verbindung zum "dbserver.msxfaq.net" aufbauen aber der Name war nicht im Zertifikat enthalten.

IIS SChannel Debugging

Eine weitere Möglichkeit eine Diagnosefunktion zu aktivieren erfolgt über REGEDIT. Bislang habe ich diesen Weg aber noch nicht benötigt.

HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel
Value Name: EventLogging
Value Type: REG_DWORD
Value Data: 7

Weitere Links