Detectiebeveiligingsvoorbeeld
Voor de detectiespecificatie is niet vereist dat eindpunten die deelnemen aan het detectieproces veilig zijn. Het verbeteren van de detectieberichten met beveiliging beperkt verschillende soorten aanvallen (berichtwijziging, Denial of Service, replay, adresvervalsing).
Het DiscoveryScenario-voorbeeld implementeert aangepaste kanalen waarmee berichthandtekeningen worden berekend en gecontroleerd met behulp van de compacte handtekeningindeling (beschreven in sectie 8.2 van de WS-Discovery-specificatie). Het voorbeeld ondersteunt zowel de 2005 Discovery-specificatie als de versie 1.1.
Het aangepaste kanaal wordt toegepast op de bestaande kanaalstack voor detectie- en aankondigingseindpunten. Op deze manier wordt er een handtekeningkop toegepast voor elk verzonden bericht. De handtekening wordt gecontroleerd op ontvangen berichten en wanneer deze niet overeenkomt of wanneer de berichten geen handtekening hebben, worden de berichten verwijderd. Voor het ondertekenen en verifiëren van berichten gebruikt het voorbeeld certificaten.
Discussie
WCF is uitbreidbaar en stelt gebruikers in staat om kanalen naar wens aan te passen. In het voorbeeld wordt een beveiligd bindingselement voor detectie geïmplementeerd waarmee beveiligde kanalen worden gebouwd. De beveiligde kanalen zijn van toepassing op en verifiëren berichthandtekeningen en worden toegepast op de huidige stack.
Met het beveiligde bindingselement worden beveiligde kanaalfactory's en kanaallisteners gebouwd.
Secure Channel Factory
De beveiligde kanaalfactory maakt uitvoer- of duplexkanalen die een compacte handtekening toevoegen aan berichtkoppen. Om berichten zo klein mogelijk te houden, wordt de compacte handtekeningindeling gebruikt. De structuur van een compacte handtekening wordt weergegeven in het volgende voorbeeld.
<d:Security ... >
[<d:Sig Scheme="xs:anyURI"
[KeyId="xs:base64Binary"]?
Refs="..."
[PrefixList]="xs:NMTOKENS"
Sig="xs:base64Binary"
... />]?
...
</d:Security>
Notitie
De PrefixList
versie is toegevoegd in het 2008 Discovery-versieprotocol.
Om de handtekening te berekenen, bepaalt het voorbeeld de uitgebreide handtekeningitems. Er wordt een XML-handtekening (SignedInfo
) gemaakt met behulp van het voorvoegsel voor de ds
naamruimte, zoals vereist voor de WS-Discovery-specificatie. De hoofdtekst en alle headers in detectie- en adresseringsnaamruimten worden in de handtekening verwezen, zodat ze niet kunnen worden gemanipuleerd. Elk element waarnaar wordt verwezen, wordt getransformeerd met behulp van de Exclusieve Canonicalization (http://www.w3.org/2001/10/xml-exc-c14n#) en vervolgens wordt een SHA-1-digestwaarde berekend (http://www.w3.org/2000/09/xmldsig#sha1). Op basis van alle elementen waarnaar wordt verwezen en de bijbehorende samenvattingswaarden, wordt de handtekeningwaarde berekend met behulp van het RSA-algoritme (http://www.w3.org/2000/09/xmldsig#rsa-sha1).
De berichten worden ondertekend met een door de client opgegeven certificaat. De opslaglocatie, naam en certificaatonderwerpnaam moeten worden opgegeven wanneer het bindingselement wordt gemaakt. De KeyId
in de compacte handtekening vertegenwoordigt de sleutel-id van het ondertekeningstoken en is de Subject Key Identifier (SKI) van het ondertekeningstoken of (als de SKI niet bestaat) een SHA-1-hash van de openbare sleutel van het ondertekeningstoken.
Secure Channel Listener
De beveiligde kanaallistener maakt invoer- of duplexkanalen waarmee de compacte handtekening in ontvangen berichten wordt gecontroleerd. Als u de handtekening wilt controleren, wordt de KeyId
opgegeven compacte handtekening die aan het bericht is gekoppeld, gebruikt om een certificaat in het opgegeven archief te selecteren. Als het bericht geen handtekening heeft of als de handtekeningcontrole mislukt, worden de berichten verwijderd. Als u de beveiligde binding wilt gebruiken, definieert het voorbeeld een fabriek waarmee aangepaste UdpDiscoveryEndpoint en UdpAnnouncementEndpoint met het toegevoegde beveiligde bindingselement voor detectie wordt gemaakt. Deze beveiligde eindpunten kunnen worden gebruikt in detectieaankondigingslisteners en detecteerbare services.
Voorbeelddetails
Het voorbeeld bevat een bibliotheek en 4 consoletoepassingen:
DiscoverySecurityChannels: een bibliotheek die de beveiligde binding beschikbaar maakt. De bibliotheek berekent en verifieert de compacte handtekening voor uitgaande/binnenkomende berichten.
Service: Een service die het ICalculatorService-contract weergeeft, zelf-hostend. De service is gemarkeerd als Detecteerbaar. De gebruiker geeft de details op van het certificaat dat wordt gebruikt voor het ondertekenen van berichten door de opslaglocatie en naam en de onderwerpnaam of andere unieke id voor het certificaat op te geven, en het archief waar de clientcertificaten zich bevinden (de certificaten die worden gebruikt om de handtekening voor binnenkomende berichten te controleren). Op basis van deze details wordt een UdpDiscoveryEndpoint met extra beveiliging gebouwd en gebruikt.
Client: Deze klasse probeert een ICalculatorService te detecteren en methoden voor de service aan te roepen. Ook hier wordt een UdpDiscoveryEndpoint met extra beveiliging gebouwd en gebruikt om de berichten te ondertekenen en te verifiëren.
AnnouncementListener: een zelf-hostende service die luistert naar online- en offlineaankondigingen en het beveiligde aankondigingseindpunt gebruikt.
Notitie
Als Setup.bat meerdere keren wordt uitgevoerd, vraagt de certificaatbeheerder u om een certificaat te kiezen dat u wilt toevoegen, omdat er dubbele certificaten zijn. In dat geval moet Setup.bat worden afgebroken en moet Cleanup.bat worden aangeroepen, omdat de duplicaten al zijn gemaakt. Cleanup.bat wordt u ook gevraagd een certificaat te kiezen dat u wilt verwijderen. Selecteer een certificaat in de lijst en ga door met het uitvoeren van Cleanup.bat totdat er geen certificaten meer zijn.
Dit voorbeeld gebruiken
Voer het Setup.bat-script uit vanaf een opdrachtprompt voor Ontwikkelaars voor Visual Studio. In het voorbeeld worden certificaten gebruikt om berichten te ondertekenen en te verifiëren. Het script maakt de certificaten met behulp van Makecert.exe en installeert ze vervolgens met behulp van Certmgr.exe. Het script moet worden uitgevoerd met beheerdersbevoegdheden.
Als u het voorbeeld wilt bouwen en uitvoeren, opent u het Security.sln-bestand in Visual Studio en kiest u Alles opnieuw opbouwen. Werk de oplossingseigenschappen bij om meerdere projecten te starten: selecteer Starten voor alle projecten behalve DiscoverySecureChannels. Voer de oplossing normaal uit.
Nadat u klaar bent met het voorbeeld, voert u het Cleanup.bat script uit waarmee de certificaten die voor dit voorbeeld zijn gemaakt, worden verwijderd.