Ik ga er nu van uit dat u mijn vorige bericht over het maken van zelfondertekende certificaten voor ontwikkeling hebt gelezen en dat u misschien hebt gedacht: “Ja, geweldig! …. Maar hoe gebruik ik ze eigenlijk?”. Deze blog post neemt je stap voor stap mee door het handmatige proces van het configureren van IIS op je PC of Windows Server om je zelf-ondertekende certificaten te gebruiken samen met IIS client certificate mapping authentication.
Let op dat ik in mijn voorbeelden gebruik maak van mijn localhost hosting en een willekeurige domeinnaam, maar je kunt dit doen op je echte server’s IIS als je een statisch IP adres hebt van je internet service provider of je domein hosting bedrijf en je firewall, router etc. correct hebt geconfigureerd waar je uiteindelijk je domeinnaam naar dat adres kunt laten wijzen. MAAR ik zal geen van beide aanraden in combinatie met zelfondertekende certificaten, tenzij uw klanten/gebruikers bereid zijn om uw zelfondertekende root- en client-certificaat te ontvangen en te installeren. Een goed voorbeeld hiervan is in een gesloten intranet waar u toegang hebt tot alle computers van de eindgebruikers omdat u dan de certificaten op hun machines kunt installeren, wat noodzakelijk is als u niet wilt dat uw gebruikers een dikke waarschuwing krijgen over vertrouwensproblemen met uw zelfondertekend servercertificaat. Als u op zoek bent naar een commerciële productie-waardige oplossing kunt u beter uw certificaten kopen in plaats van ze zelf te ondertekenen. Nu we dat uit de weg hebben, gebruik ik een PC met Windows 8.1 Pro, IIS 8.5 en Visual Studio Premium 2013. (Ik heb ook getest met een Windows Server 2012 R2 Hyper-V VM op mijn PC).
Installatie van IIS
Als u IIS nog niet hebt geïnstalleerd op de machine die als hostserver zal fungeren, doe dat dan door op de Windows-toets voor een PC te drukken en te zoeken naar “Windows-functies in- of uitschakelen” (of ga naar het Configuratiescherm en zoek). Controleer Internet Information Services en de volgende childnodes.
(Als u .NET 3.5 gebruikt, moet u de .NET Extensibility 3.5 en ASP.NET 3.5)
Voor Windows Server 2012 gaat u naar het Server Manager Dashboard ➜ Klik op rollen en kenmerken toevoegen ➜ Kies voor een installatie op basis van rollen of kenmerkengebaseerde installatie en ga naar de volgende ➜ Selecteer de server ➜ Schakel de serverrol met de naam Web Server (IIS) en de volgende kindelementen in
Zorg er ook voor dat Application Development is aangevinkt met de volgende kindelementen
Klik op OK en laat Windows installeren.
Maken van ons voorbeeldproject
In het kader van deze demo maken we een heel eenvoudige mini-applicatie die we in de lokale IIS hosten. (U kunt de mijne ook rechtstreeks op Github forken)
In Visual Studio maakt u een nieuwe lege webapplicatie en verwijst u naar web api
We hebben alleen een heel eenvoudige controller nodig:
using System.Web.Http;namespace IISWithCertificatesSample.WebApi.Controllers{ public class CatsController : ApiController { public IHttpActionResult Get() { return Ok("A lot of cats meowing for food"); } }}
U zou nu in staat moeten zijn om beide routes (F5) uit te voeren en naar de localhost url te surfen met /api/cats (de mijne ziet eruit als http://localhost:62172/api/cats). Geweldig, laten we deze applicatie hosten met behulp van onze lokale IIS.
NOOT: We zullen de applicatie niet langer direct vanuit Visual Studio (F5) draaien, die is ingesteld om IIS Express te gebruiken.
Configuratie van IIS
Open uw IIS Manager (Windows knop + zoek er naar). Voeg een nieuwe website en applicatie pool toe met onze voorbeeld applicatie. (Klik met de rechtermuisknop op Sites ➜ Website toevoegen) Het pad moet de map zijn waar de documenten van uw website zich bevinden, dus als u uw website hebt gepubliceerd, wijst u het pad daarheen. Ik ga gewoon het directe pad naar het project in Visual Studio gebruiken voor dit zeer eenvoudige voorbeeld.
Nu laten we deze site lokaal hosten door de hostnaam AKA. uw domeinnaam op te geven.
Om de site lokaal te kunnen hosten, moet ik deze aan mijn hosts-bestand toevoegen om het IP-adres van mijn localhost aan de hostnaam te koppelen. Dit doe ik door kladblok als administrator te draaien en het hosts bestand te openen in het pad: %systemroot%%System32driversetc
En aan het eind het volgende toe te voegen: 127.0.0.1 yourdomain.com www.yourdomain.com
Wanneer ik nu naar yourdomain.com surf en www.yourdomain.com op mijn machine zet, zal de site met mijn nieuw toegevoegde bindingen worden omgezet naar het 127.0.0.1 IP-adres (dat is het IP-adres van localhost).
Laten we nu de www. binding aan uw site in de IIS Manager ook
Surf naar de domeinnaam die u hebt ingesteld in de bindingen met of zonder www. en voeg de uitgang /api/cats toe en u zou de miauwende katten moeten krijgen. (Zo niet, probeer dan de cache te legen)
HOOG BELANGRIJK: Dit gebeurt ALLEEN op de lokale machine, omdat we het hosts bestand hebben aangepast om onze verzoeken van de domeinnaam die we hebben toegevoegd om te leiden naar het localhost IP adres. Het is bedoeld voor ontwikkeling en om uw wijzigingen te kunnen testen voordat u ze op uw echte web hosting server implementeert.
De server beveiligen met SSL
Nu willen we de cats beveiligen door een SSL certificaat aan onze Server toe te voegen.
In uw IIS Manager gaat u naar uw server (De top van de boom aan de linkerkant) ➜ Scroll naar beneden en dubbel-klik Server Certificaten.
(Als uw zelfondertekende certificaat hier al staat, spring dan verder naar de bindingsstappen)
We moeten ons zelfondertekende servercertificaat importeren om https-communicatie met SSL mogelijk te maken, dus klik op Importeren…
Klik op de … en zoek uw .pfx bestand, vul het wachtwoord in (de -po parameter in uw opdracht batch bestand) en klik OK
Uw certificaat is nu toegevoegd
Dubbel-klik op het nieuw toegevoegde cert om te verifiëren dat het vertrouwd is (Uw zelf ondertekende certificaten zijn toegevoegd aan de juiste stores in mijn vorige post, dus nogmaals: lees het als u nu verdwaald bent ;-))
Zo ver, zo goed! Nu kunnen we de https-binding toevoegen, op dezelfde manier als voorheen maar kies https met poort 443, uw domein als hostnaam en zoek uw zelfondertekende certificaat in de vervolgkeuzelijst
Vink het vakje Server Name Indication aan waardoor onze server meerdere certificaten op hetzelfde IP-adres geïnstalleerd kan hebben door de hostnaam mee te sturen met de eerste stap van de SSL-handshake. Herhaal dezelfde stappen om SSL toe te voegen voor www.yourdomain.com toe te voegen, maar dan met een certificaat waarvan de CN-naam overeenkomt met de domeinnaam of een wildcardcertificaat
Onze bindingen zijn nu compleet
Tadaa, u kunt nu https://yourdomain.com/api/cats en https://www.yourdomain.com/api/cats
NOTA: Firefox maakt geen gebruik van de Windows certificate store, dus u zult uw root CA handmatig moeten toevoegen. Ga naar Firefox Instellingen ➜ Opties ➜ Geavanceerd ➜ Certificaten weergeven ➜ Autoriteiten ➜ Importeer uw CARoot.cer bestand
IIS Client Certificate Mapping Authentication
We hebben nu het gebruik van het root- en servercertificaat doorgenomen en u vraagt zich waarschijnlijk af wat we moeten doen met het clientcertificaat dat we ook in mijn vorige post hebben gemaakt. Dit is voor situaties waarin we bijvoorbeeld clients moeten authenticeren zonder een gebruikers login en paswoord te gebruiken, maar eerder willen dat de server aan de client vraagt om zijn certificaat te tonen en als het het juiste is, wordt de client toegelaten. Dit kan worden gedaan met een Many-To-One of een One-To-One mapping en ik zal je laten zien hoe je beide handmatig kunt doen in de IIS Manager.
Eerst moeten we de functie installeren, dus ga naar “Windows functies in- of uitschakelen” en installeer het volgende
We vertellen onze server dat hij een SSL-certificaat van de client moet vereisen
Dan moeten we de server configureren om te weten welk client-certificaat hij moet valideren, dus ga naar de Configuratie-editor en kies de sectie iisClientCertificateMappingAuthentication (u kunt ook het pad system.webServer/security/authentication/iisClientCertificateMappingAuthentication in het Section veld)
Many-To-One Mappings
Als u meerdere client certificaten wilt toewijzen aan een enkele gebruiker dan is deze aanpak wat u nodig heeft. U kunt cliëntcertificaten ook op deze manier delen door het cliëntcertificaat (en de CA Root, aangezien we een zelf-ondertekend certificaat hebben) te installeren op andere gebruikers op welke machine dan ook om toegang te krijgen, zolang het cliëntcertificaat overeenkomt met de regelcriteria van de toewijzing. Dit zou bijvoorbeeld handig zijn in een situatie waarin u wilt dat alle gebruikers in een organisatie toegang krijgen via een enkele gebruikersmapping.
Inschakelen van de authenticatie van de client certificate mapping
Om een mapping toe te voegen klikt u op de … van de manyToOneMappings
Hier voegt u de gebruikers toe die u toegang wilt verlenen.
Vul de eigenschappen voor een mapping in en herhaal dit voor elke gebruiker die u toegang wilt verlenen of weigeren. Vergeet niet dat u het clientcertificaat en het root-CA-certificaat op alle mmc’s van de gebruikers moet hebben geïnstalleerd.
BELANGRIJK: om dit te laten werken moet u een geldige gebruikersnaam en wachtwoord invoeren en aangezien mijn computer de server is, zijn de referenties mijn Windows-gebruikersnaam en -wachtwoord.
Nu moeten we enkele regels maken voor deze mapping, zodat de server kan bepalen of een client wordt toegelaten of niet. Klik op de rules eigenschap en de … knop
Ik zal één regel toevoegen als voorbeeld waar de server het client certificaat zal controleren om te zien of het is ondertekend door de juiste CA root. Ga je gang en voeg meer regels toe voor meer veiligheid, ga naar de IIS Many-To-One Mapping referentie voor meer documentatie.
Vergeet niet de wijzigingen in IIS Manager toe te passen, dus sluit het venster met regels en mappings en klik op Toepassen
Open een nieuw incognitovenster om er zeker van te zijn dat u met een schone lei begint wat cache en cookies betreft en voer uw url in met de /api/cats en zie dat de browser u om een certificaat vraagt. Kies het ClientCert en klik ok om toegang tot de cats te krijgen.
Als dit niet werkt, controleer dan of uw client certificaat zowel in uw CurrentUser/Personal store als in uw browser’s certificate store staat. Zo ja, ga dan naar Configuratiescherm ➜ Internetopties ➜ Inhoud en klik op SSL-status wissen.
Open een nieuw incognitovenster en probeer het opnieuw, uw browser zou u nu om het cliëntcertificaat moeten vragen.
NOOT: Onthoud, zoals ik eerder heb uitgelegd, dat Firefox zijn eigen certificaatopslag heeft, dus u moet het cliëntcertificaat importeren in “Uw certificaten” om dit te kunnen gebruiken.
Eén-op-één toewijzingen
Laten we de één-op-één toewijzingen ook eens doorlopen. Deze aanpak betekent dat we een individueel cliëntcertificaat nodig hebben voor elke gebruikersmapping. U kan ofwel de één-op-één mapping uitschakelen en hetzelfde certificaat en gebruiker gebruiken, ofwel nieuwe aanmaken. Ga terug naar de Configuratie-editor en open de iisClientCertificateMappingAuthentication sectie opnieuw. Klik op de … van de oneToOneMappings.
Om de mapping aan het certificaat toe te voegen moeten we de publieke sleutel van het client certificaat bestand exporteren. U kunt dit exporteren vanuit uw Machine Management Console (druk op de Windows-toets en zoek naar mmc) Snap in de persoonlijke opslag van het certificaat van de lokale machine en exporteer het ssl-certificaat van de client dat u wilt gebruiken zonder de privésleutel in het base64-formaat.
Rechter muisklik op het nieuw geëxporteerde certificaat en open het met kladblok. Verwijder alle regeleindes in het certificaat zelf.
Kopieer dit nu naar het veld met certificaateigenschappen van de mapping en vul de rest in
BELANGRIJK: om dit te laten werken, moet u een geldige gebruikersnaam en wachtwoord invoeren en aangezien mijn computer de server is, zullen de gegevens een Windows-gebruikersnaam en -wachtwoord zijn.
Ook hier geldt: vergeet niet de wijzigingen toe te passen.
En daar gaat u, probeer het uit en kies wanneer daarom wordt gevraagd het certificaat dat u hebt toegewezen aan de gebruiker die u zojuist hebt toegewezen.
Ik hoop dat u dit bericht nuttig vond en in mijn volgende bericht zal ik bespreken hoe u zelfondertekende certificaten kunt gebruiken in combinatie met Windows Azure en hoe u IIS kunt configureren met behulp van C#-code, bekijk het hier: http://blog.jayway.com/2015/04/21/configure-a-windows-azure-cloud-service-to-use-your-self-signed-certificates-for-iis-client-certificate-mapping-authentication/
Heb een goede =)