Verwenden eines benutzerdefinierten X509CertificateValidator mit einem iis gehosteten WCF-Dienst und selbstsigniertem Clientzertifikat

In diesem Artikel wird die Verwendung eines benutzerdefinierten Microsoft-Internetinformationsdienste X509CertificateValidator (IIS) beschrieben, der Windows WCF-Dienst (Communication Foundation) und selbstsignierter Clientzertifikate gehostet wird.

Ursprüngliche Produktversion:   Windows Communication Foundation
Ursprüngliche KB-Nummer:   2480671

Zusammenfassung

Sie konfigurieren einen WCF-Dienst für die Verwendung eines Clientzertifikats für die SSL-Authentifizierung (Secure Sockets Layer). Sie möchten einen benutzerdefinierten X509CertificateValidator verwenden, um die Clientzertifikate in der Anwendungsschicht (WCF-Dienst) und nicht auf der Betriebssystemebene zu überprüfen.

WCF 3.5 SP1 lässt die Verwendung von "Custom" nicht X509CertificateValidators zu, ohne einen Hotfix zu installieren. In .NET 4 Windows Communication Foundation kann ein Benutzerdefinierter X509CertificateValidator nur verwendet werden, wenn das Zertifikat auf betriebssystemebene erfolgreich überprüft werden konnte. Insbesondere wäre es nicht möglich, selbstsignierte Clientzertifikate zu verwenden, ohne sie im Zertifikatspeicher für vertrauenswürdige Stammzertifizierungsstellen zu installieren (kann Tausende von verschiedenen Zertifikaten sein).

Vorgehensweisen

Um dieses Szenario zu aktivieren, sind die folgenden Schritte erforderlich:

  1. Legen Sie den Registrierungsschlüssel SendTrustedIssuerList in der Registrierung auf 0 (DWORD) fest. Weitere Informationen finden Sie unter TLS/SSL-Tools und Einstellungen.

    Standardmäßig sendet SChannel (die zum Herstellen von SSL-Verbindungen verwendete Betriebssystemkomponente) während des SSL-Handshakes eine Liste der vertrauenswürdigen Aussteller an den Client. Es ist fertig, damit die Anwendung auf der Clientseite dem Benutzer die Auswahl des zu verwendenden Zertifikats erleichtert. Standardmäßig sendet SChannel eine Liste aller Zertifikate (tatsächlich die Fingerabdrücke), die im Zertifikatspeicher für vertrauenswürdige Zertifizierungsstellen installiert sind. Sie können diese Liste reduzieren, indem Sie eine TCL (Trusted Certificate List) angeben. Um beispielsweise zu verlangen, dass Clients ihre Smartcardzertifikate verwenden, erstellen Sie eine Zertifikatvertrauensliste (Certificate Trust List, CTL), die nur das Stammzertifikat für die Zertifizierungsstelle enthält, die diese Smartcardzertifikate ausstellt. Weitere Informationen zum Erstellen einer CTL finden Sie unter "Sicherheit in Microsoft IIS".

    Wenn Sie die Verwendung von Clientzertifikaten zulassen möchten, die Sie im Serverbetriebssystem nicht überprüfen können (z. B. selbstsigniert und nicht im Speicher für vertrauenswürdige Stammzertifizierungsstellen installiert), müssen Sie den Wert für SendTrustedIssuerList HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL "in" auf "0" festlegen. In diesem Fall sendet der Server keine Liste der vertrauenswürdigen Aussteller an den Client, und der Client ermöglicht es dem Benutzer, alle verfügbaren Clientzertifikate zu verwenden.

    Warnung

    Dabei SendTrustedIssuerList handelt es sich um einen computerweiten Schlüssel. Wenn sie geändert wird, sind alle Anwendungen (virtuelle Verzeichnisse) mit Clientzertifikatauthentifizierung betroffen.

    Dieser Schritt ist nur erforderlich, wenn es nicht möglich ist, auch das Clientzertifikat auf der Betriebssystemebene zu überprüfen.

  2. OnGlobalPreBeginRequestOverride-Ereignis im HTTP-Modul (HyperText Transfer Protocol), das von IIS verwendet wird (nur erforderlich, wenn der WCF-Dienst in IIS gehostet wird).

    Erst nach den in Schritt 1 beschriebenen Änderungen sendet der Client tatsächlich ein Zertifikat. Bevor Sie diese Änderung angewendet haben, werden Fehlermeldungen angezeigt, dass der Client kein Zertifikat gesendet hat (auch wenn Sie ein Zertifikat in oder in Internet Explorer festgelegt System.Net.HttpWebRequest haben). Wenn die Anforderung serverseitig eingeht, wird von der SChannel-Komponente beim Herstellen der SSL-Verbindung immer eine Zertifikatüberprüfung ausgeführt. Der Rückgabecode dieser Zertifikatüberprüfung wird an die Aufrufer übergeben. Wenn der WCF-Dienst in IIS gehostet wird, überprüft IIS den Rückgabecode der SChannel-Zertifikatüberprüfung und beendet die Anforderung mit Fehlercode 403 (Zugriff verweigert) in einer frühen Phase der HTTP-Pipeline. Die einzige Möglichkeit, dieses Verhalten in IIS derzeit zu vermeiden, besteht darin, das Ereignis in der HTTP-Pipeline außer Kraft zu OnGlobalPreBeginRequest setzen. Es ist einer der wenigen Erweiterungspunkte in IIS, der nur mit systemeigenem Code verwendet werden kann – ohne verwalteten Code (.NET). Die Dokumentation finden OnGlobalPreBeginRequest Sie unter CGlobalModule::OnGlobalPreBeginRequest-Methode.

    Dieser Schritt ist nur erforderlich, wenn es nicht möglich ist, auch das Clientzertifikat auf der Betriebssystemebene zu überprüfen.

  3. Installieren Sie WCF QFE, um benutzerdefinierte X509CertificateValidator anzugeben.

    WCF verwendete ursprünglich auch den SChannel-Ergebniscode, um Clientzertifikate zu überprüfen. Wenn der Rückgabecode 0 (erfolgreich) lautete, war die Authentifizierung zulässig, und ein hartcodiertes X509CertificateValidator wurde verwendet, wobei der Überprüfungsmodus auf X509CertificateValidationMode.None (X509CertificateValidationMode Enum) festgelegt ist. Dies bedeutet, dass es bei Verwendung des Transports im Sicherheitsmodus nicht möglich war, andere X509CertificateValidationMode WCF-Elemente wie Peer , oder Chain Custom Clientzertifikate zu verwenden.

    In .NET 4 wurde dieses Problem behoben, und der Fix wurde auch in .NET 3.5 SP1 zurückportiert. Nachdem Sie den unten erwähnten Hotfix angewendet haben, können Sie das Überprüfungsverhalten nur bei der Angabe außer Kraft X509CertificateValidationMode.Custom setzen. Wenn Sie so etwas wie oder verwenden X509CertificateValidationMode.PeerTrust PeerOrChainTrust möchten, müssen Sie eine benutzerdefinierte erstellen, die den Standardprüfer für den gezielten Überprüfungsmodus wiederverwendet. Diese Einschränkung wird angewendet, um unterbrechungsbezogene Änderungen zu vermeiden. Die Konfiguration für eine Benutzerdefinierte X509CertificateValidator würde wie folgt aussehen:

    <serviceCredentials>
        <clientCertificate>
            <authentication certificateValidationMode="Custom" customCertificateValidatorType="Samples.MyCertificateValidator, Samples" />
        </clientCertificate>
    </serviceCredentials>
    

    Dieser Schritt ist nur erforderlich, wenn .NET Framework 3.5 SP1 (nicht für .NET 4) verwendet wird.