Beispiel für Ermittlungssicherheit

Die Discovery-Spezifikation erfordert nicht, dass Endpunkte, die am Suchvorgang beteiligt sind, sicher sein müssen. Die Erweiterung der Sicherheit von Suchmeldungen mindert das Risiko für verschiedene Angriffe (Meldungsänderung, Denial of Service, Wiederholung, Spoofing).

In dem Beispiel DiscoveryScenario werden benutzerdefinierte Kanäle implementiert, die Nachrichtensignaturen mithilfe des kompakten Signaturformats (beschrieben in Abschnitt 8.2 der WS-Discovery-Spezifikation) berechnen und überprüfen. Das Beispiel unterstützt sowohl die Discovery-Spezifikation von 2005 als auch die Version 1.1.

Der benutzerdefinierte Kanal wird an die oberste Stelle des vorhandenen Kanalstapels für Ermittlungs- und Ankündigungsendpunkte gesetzt. Auf diese Weise wird ein Signaturheader für jede gesendete Meldung übernommen. Die Signatur wird im Hinblick auf empfangene Meldungen überprüft. Wenn die Signatur nicht übereinstimmt oder die Meldungen nicht über eine Signatur verfügen, werden sie verworfen. Im Beispiel werden Zertifikate verwendet, um Meldungen zu signieren und zu überprüfen.

Diskussion (Discussion)

WCF ist erweiterbar und bietet Benutzern die Möglichkeit, die Kanäle nach Belieben anzupassen. Im Beispiel wird ein sicheres Ermittlungsbindungselement implementiert, mit dem sichere Kanäle erstellt werden. Die sicheren Kanäle wenden Meldungssignaturen an und überprüfen diese. Sie werden an die oberste Stelle des aktuellen Stapels übernommen.

Mit dem sicheren Bindungselement werden sichere Kanalfactorys und Kanallistener erstellt.

Sichere Kanalfactory

Von der sicheren Kanalfactory werden Ausgabe- oder Duplexkanäle erstellt, mit denen Nachrichtenheadern eine kompakte Signatur hinzugefügt wird. Damit Meldungen möglichst klein bleiben, wird das kompakte Signaturformat verwendet. Im folgenden Beispiel wird die Struktur einer kompakten Signatur dargestellt.

<d:Security ... >
  [<d:Sig Scheme="xs:anyURI"
         [KeyId="xs:base64Binary"]?
          Refs="..."
         [PrefixList]="xs:NMTOKENS"
          Sig="xs:base64Binary"
          ... />]?
  ...
</d:Security>

Hinweis

Die PrefixList wurde dem Protokoll der Discovery-Version 2008 hinzugefügt.

Im Beispiel werden die erweiterten Signaturelemente bestimmt, um die Signatur zu berechnen. Wie in der WS-Discovery-Spezifikation gefordert, wird eine XML-Signatur (SignedInfo) mit dem ds-Namespacepräfix erstellt. In der Signatur wird auf den Text und auf alle Header in Ermittlungs- und Adressierungsnamespaces verwiesen, damit diese nicht manipuliert werden können. Jedes referenzierte Element wird mithilfe der exklusiven Kanonisierung (http://www.w3.org/2001/10/xml-exc-c14n#) umgewandelt, und dann wird ein SHA-1-Digestwert berechnet (http://www.w3.org/2000/09/xmldsig#sha1). Basierend auf allen referenzierten Elementen und ihren Digestwerten wird der Signaturwert mithilfe des RSA-Algorithmus (http://www.w3.org/2000/09/xmldsig#rsa-sha1) berechnet.

Die Meldungen werden mit einem vom Client angegebenen Zertifikat signiert. Bei der Erstellung des Bindungselements müssen Speicherort, Name und Zertifikatantragstellername angegeben werden. Die KeyId in der kompakten Signatur stellt den Schlüsselbezeichner des Signaturtokens dar und ist die Schlüsselkennung des Antragstellers (SKI) des Signaturtokens oder, wenn der SKI nicht vorhanden ist, ein SHA-1-Hash des öffentlichen Schlüssels des Signaturtokens.

Sicherer Kanallistener

Der sichere Kanallistener erstellt Eingabe- oder Duplexkanäle, die die kompakte Signatur in empfangenen Meldungen überprüfen. Um die Signatur zu überprüfen, wird die KeyId verwendet, die in der an die Meldung angefügten kompakten Signatur angegeben ist, um ein Zertifikat aus dem angegebenen Speicher auszuwählen. Wenn die Meldung über keine Signatur verfügt oder die Signaturüberprüfung nicht erfolgreich ist, werden die Meldungen verworfen. Im Beispiel wird zur Verwendung der sicheren Bindung eine Factory definiert, mit der benutzerdefinierte UdpDiscoveryEndpoint und UdpAnnouncementEndpoint mit dem zusätzlichen sicheren Ermittlungsbindungselement erstellt werden. Diese sicheren Endpunkte können in Discovery-Ankündigungslistenern und erkennbaren Diensten verwendet werden.

Beispieldetails

Das Beispiel enthält eine Bibliothek und 4 Konsolenanwendungen:

  • DiscoverySecurityChannels: Eine Bibliothek, die sichere Bindung verfügbar macht. Die Bibliothek berechnet und überprüft die kompakte Signatur für ausgehende/eingehende Meldungen.

  • Dienst: Ein Dienst, der den ICalculatorService-Vertrag verfügbar macht; selbst gehostet. Der Dienst wird als erkennbar markiert. Der Benutzer gibt die Details des Zertifikats an, mit dem Meldungen signiert werden. Dazu werden Speicherort, Name und Antragsstellername oder andere eindeutige Bezeichner für das Zertifikat sowie der Speicher, in dem sich die Clientzertifikate befinden, angegeben. (Clientzertifikate sind Zertifikate, mit denen die Signatur auf eingehende Meldungen überprüft werden.) Auf Grundlage dieser Details wird ein UdpDiscoveryEndpoint mit zusätzlicher Sicherheit erstellt und verwendet.

  • Client: Diese Klasse versucht, einen ICalculatorService zu ermitteln und Methoden für den Dienst aufzurufen. Es wird ein UdpDiscoveryEndpoint mit erweiterter Sicherheit erstellt, mit dem die Meldungen signiert und überprüft werden.

  • AnnouncementListener: Ein selbst gehosteter Dienst, der auf Online- und Offlineankündigungen lauscht und den sicheren Ankündigungsendpunkt verwendet.

Hinweis

Wenn Setup.bat mehrmals ausgeführt wird, werden Sie vom Zertifikat-Manager dazu aufgefordert, ein Zertifikat auszuwählen, das hinzugefügt werden soll, da es doppelte Zertifikate gibt. In diesem Fall muss Setup.bat abgebrochen und Cleanup.bat aufgerufen werden, da die Duplikate bereits erstellt wurden. Sie werden außerdem von Cleanup.bat dazu aufgefordert, ein Zertifikat auszuwählen, das gelöscht werden soll. Wählen Sie ein Zertifikat aus der Liste aus, und führen Sie weiterhin Cleanup.bat aus, bis keine Zertifikate mehr verbleiben.

So verwenden Sie dieses Beispiel

  1. Führen Sie das Skript „Setup.bat“ von einer Developer-Eingabeaufforderung für Visual Studio aus. Im diesem Beispiel werden Zertifikate verwendet, um Meldungen zu signieren und zu überprüfen. Das Skript erstellt die Zertifikate mit Makecert.exe und installiert sie dann mit Certmgr.exe. Das Skript muss mit Administratorberechtigungen ausgeführt werden.

  2. Öffnen Sie die Datei „Security.sln“ in Visual Studio, und wählen Sie Alles neu erstellen aus, um das Beispiel zu erstellen und auszuführen. Aktualisieren Sie die Projektmappeneigenschaften, um mehrere Projekte zu starten: Wählen Sie für alle Projekte außer DiscoverySecureChannels Start aus. Führen Sie die Projektmappe wie gewohnt aus.

  3. Nachdem Sie das Beispiel abgeschlossen haben, führen Sie das Skript Cleanup.bat aus. Damit werden alle für dieses Beispiel erstellten Zertifikate entfernt.