Jeg går nu ud fra, at du har læst mit tidligere indlæg om, hvordan du opretter selvsignerede certifikater til udvikling, og det har måske efterladt dig med tanken “Yay great! ….Men hvordan bruger jeg dem egentlig?”. Dette blogindlæg vil tage dig trin for trin gennem den manuelle proces med at konfigurere IIS på din pc eller Windows Server til at bruge dine selvsignerede certifikater sammen med IIS klientcertifikat mapping autentificering.
Bemærk venligst, at jeg i mine eksempler jeg bruger min localhost hosting og et tilfældigt domænenavn, men du kan gøre dette på din rigtige server IIS, hvis du har en statisk IP-adresse fra din internetudbyder eller dit domæne hosting selskab samt konfigureret din firewall, router osv. korrekt, hvor endelig du kan pege dit domænenavn til din at adresse. MEN jeg vil ikke anbefale hverken det ene eller det andet sammen med selvsignerede certifikater, med mindre dine kunder/brugere er villige til at modtage og installere dit selvsignerede rod- og klientcertifikat. Et godt eksempel på dette er i et lukket intranet hvor du har adgang til alle slutbrugernes computere, for så kan du installere certifikaterne på deres maskiner, hvilket er nødvendigt hvis du ikke vil have at dine brugere får en stor fed advarsel om tillidsproblemer med dit selvsignerede servercertifikat. Hvis du er på udkig efter en kommerciel produktionsværdig løsning bør du købe dine certifikater i stedet for at selvsignere. Så nu har vi det af vejen, jeg bruger en pc med Windows 8.1 Pro, IIS 8.5 og Visual Studio Premium 2013. (Jeg har også testet med en Windows Server 2012 R2 Hyper-V VM på min pc).
Installation af IIS
Hvis du ikke allerede har installeret IIS på den maskine, der skal fungere som hosting-server, skal du gøre det ved at trykke på Windows-knappen for en pc og søge “Slå Windows-funktioner til eller fra” (eller gå til Kontrolpanel og søg). Kontroller Internet Information Services og følgende underordnede knudepunkter.
(Hvis du kører med .NET 3.5, skal du kontrollere .NET Extensibility 3.5 og ASP.NET 3.5.5)
For Windows Server 2012 skal du gå til Server Manager Dashboard ➜ Klik på Tilføj roller og funktioner ➜ Vælg rollebaseret eller funktions-baseret installation, og gå videre ➜ Vælg serveren ➜ Aktivér serverrollen kaldet Webserver (IIS) og følgende underordnede elementer
Sørg også for, at applikationsudvikling er markeret med følgende underordnede elementer
Klik på OK, og lad Windows installere.
Skabelse af vores eksempelprojekt
Med henblik på denne demo vil vi oprette en virkelig simpel mini-applikation, som vi vil hoste i den lokale IIS. (Du kan også bare gafle min direkte på Github)
I Visual Studio skal du oprette en ny tom webapplikation og referere til web api
Vi skal bare bruge en reeeeeelt simpel controller:
using System.Web.Http;namespace IISWithCertificatesSample.WebApi.Controllers{ public class CatsController : ApiController { public IHttpActionResult Get() { return Ok("A lot of cats meowing for food"); } }}
Du skal nu kunne køre begge ruter (F5) og surfe til localhost url’en med /api/cats (min ser ud som http://localhost:62172/api/cats). Fedt, lad os hoste denne applikation ved hjælp af vores lokale IIS.
BEMÆRK: Vi vil ikke længere køre applikationen direkte fra Visual Studio (F5), som er indstillet til at bruge IIS Express.
Konfigurering af IIS
Åbn din IIS Manager (Windows-knappen + søg efter den). Tilføj et nyt websted og en applikationspool med vores prøveprogram. (Højreklik på Sites ➜ Tilføj websted) Stien skal være den mappe, hvor dine webstedsdokumenter er placeret, så hvis du har offentliggjort dit websted, skal du pege stien derhen. Jeg vil bare bruge den direkte sti til projektet i Visual Studio til dette meget enkle eksempel.
Nu skal vi hoste dette websted lokalt ved at angive værtsnavnet AKA. dit domænenavn.
Da jeg kun hoster lokalt, skal jeg tilføje webstedet til min lokale hosts-fil for at binde min localhost IP-adresse med værtsnavnet. Dette gøres ved at køre notepad som administrator og åbne hosts-filen i stien: %systemroot%\System32\drivers\etc
Opnå følgende i slutningen: 127.0.0.0.1 yourdomain.com www.yourdomain.com
Nu, når jeg surfer til yourdomain.com og www.yourdomain.com på min maskine, vil den opløse webstedet med mine nyligt tilføjede bindinger til IP-adressen 127.0.0.0.1 (som er localhosts IP-adresse).
Lad os tilføje www. binding til dit websted i IIS Manager også
Surf til det domænenavn, du har oprettet i bindings med eller uden www. og tilføj endelsen /api/cats, og du skulle få de miavende katte. (Hvis ikke, så prøv at tømme cachen)
VIGTIGT: Dette vil KUN ske på den lokale maskine, fordi vi ændrede hosts-filen til at omdirigere vores anmodninger fra det domænenavn, vi tilføjede, til IP-adressen localhost. Det er beregnet til udvikling og til at kunne teste dine ændringer, før du udruller dem til din rigtige webhosting-server.
Sikring af serveren med SSL
Nu vil vi sikre kattene ved at tilføje et SSL-certifikat til vores Server.
I din IIS Manager går du til din server (Øverst i træet til venstre) ➜ Rul ned og dobbeltklik på Servercertifikater.
(Hvis dit selvunderskrevne certifikat allerede er her, skal du springe videre til trinene for bindinger)
Vi skal importere vores selvunderskrevne servercertifikat for at aktivere https-kommunikation med SSL, så klik på Importer…
Klik på … og find din .pfx-fil, udfyld adgangskoden (parameteren -po i din kommandobatch-fil) og klik på OK
Dit certifikat er nu tilføjet
Dobbeltklik på det nyligt tilføjede cert for at verificere, at det er betroet (Dine selvsignerede certifikater blev tilføjet til de korrekte lagre i mit tidligere indlæg, så igen: Læs det, hvis du er faret vild lige nu ;-))
Så langt, så godt! Nu kan vi tilføje https-bindingen, på samme måde som før, men vælg https med port 443, dit domæne som værtsnavn og find dit selvsignerede certifikat i rullelisten
Kryds feltet Server Name Indication, som gør det muligt for vores server at have flere certifikater installeret på samme IP-adresse ved at sende værtsnavnet med det første trin af SSL-håndslaget. Gentag de samme trin for at tilføje SSL for www.yourdomain.com, men med et certifikat, hvor CN-navnet passer til domænenavnet eller et wildcard-certifikat
Vores bindinger er komplette for nu
Tadaa, du kan nu bruge https://yourdomain.com/api/cats og https://www.yourdomain.com/api/cats
NOTE: Firefox bruger ikke Windows’ certifikatlager, så du skal tilføje din root CA manuelt. Gå til Firefox-indstillinger ➜ Indstillinger ➜ Indstillinger ➜ Avanceret ➜ Vis certifikater ➜ Autoriteter ➜ importere din CARoot.cer-fil
IIS Client Certificate Mapping Authentication
Vi har nu været igennem brugen af rod- og servercertifikater, og du undrer dig sikkert over, hvad du skal gøre med det klientcertifikat, som vi også oprettede i mit tidligere indlæg. Dette er til situationer hvor vi f.eks. har brug for at autentificere klienter uden en bruger login og password tilgang, men i stedet ønsker at serveren skal bede klienten om at vise sit certifikat og hvis det er det rigtige, så får klienten adgang. Dette kan gøres med en Many-To-One eller en One-To-One mapping, og jeg vil vise dig hvordan du gør begge dele manuelt i IIS Manager.
Først skal vi installere funktionen, så få “Turn Windows features on or off” frem igen og installer følgende
Vi fortæller vores server, at den skal kræve et SSL-certifikat fra klienten
Så skal vi konfigurere serveren, så den ved, hvilket klientcertifikat den skal validere, så gå til Configuration Editor og vælg afsnittet iisClientCertificateMappingAuthentication (du kan også indtaste stien system.webServer/security/authentication/iisClientCertificateMappingAuthentication i feltet Section)
Many-To-One Mappings
Hvis du ønsker at mappe flere klientcertifikater til en enkelt bruger, er denne fremgangsmåde det, du har brug for. Du kan også dele klientcertifikater på denne måde ved at installere klientcertifikatet (og CA Root, da vi er selv-signerende certifikat) på andre brugere på hvilken som helst maskine for at få adgang, så længe klientcertifikatet passer til regelkriterierne i kortlægningen. Det ville f.eks. være nyttigt i en situation, hvor du ønsker, at alle brugere i en organisation skal få adgang via en enkelt brugertilknytning.
Aktiver godkendelsen af klientcertifikattilknytningen
For at tilføje en tilknytning klik på … af manyToOneMappings
Her tilføjer du de brugere, som du vil give adgang.
Udfyld egenskaberne for en mapping, og gentag for hver bruger, du vil konfigurere til adgang eller afvisning. Husk, at du skal have klientcertifikatet og root CA-certifikatet installeret på alle brugernes mmc.
VIGTIGT: For at dette kan fungere, skal du indtaste et gyldigt brugernavn og password, og da min computer er serveren, vil legitimationsoplysningerne være mit Windows-brugernavn og password.
Nu skal vi oprette nogle regler til denne mapping, så serveren kan afgøre, om en klient får adgang eller ej. Det er en så klik på rules property og på … knappen
Jeg vil tilføje en regel som et eksempel, hvor serveren vil kontrollere klientcertifikatet for at se, om det er underskrevet af den korrekte CA root. Gå videre og tilføj flere regler for mere sikkerhed, besøg venligst IIS Many-To-One Mapping-referencen for at få mere dokumentation.
Husk at anvende ændringerne i IIS Manager, så luk vinduerne regler og tilknytninger, og klik på Anvend
Åbn et nyt inkognito browservindue for at sikre, at du starter fra en ren skifer cache- og cookie-mæssigt, og indtast din url med /api/cats, og se browseren bede dig om et certifikat. Vælg ClientCert og klik ok for at få adgang til katte.
Hvis dette ikke virker, skal du sørge for, at dit klientcertifikat er i dit CurrentUser/Personlig lager samt i din browsers certifikatlager. Hvis ja, skal du gå til Kontrolpanel ➜ Internetindstillinger ➜ Indhold, og klikke på Ryd SSL-tilstand.
Åbn et nyt inkognito vinduer og prøv igen, din browser bør nu bede dig om klientcertifikatet.
BEMÆRK: Husk som jeg forklarede tidligere, at Firefox har sit eget certifikatlager, så du skal importere klientcertifikatet i “Dine certifikater” for at kunne bruge dette.
En-til-en-tilknytninger
Lad os også gennemgå en-til-en-tilknytningerne. Denne fremgangsmåde betyder, at vi har brug for et individuelt klientcertifikat for hver brugertilknytning. Du kan enten deaktivere mange-til-en-tilknytningen og bruge det samme certifikat og den samme bruger eller oprette nye. Gå tilbage til konfigurationseditoren, og åbn afsnittet iisClientCertificateMappingAuthentication igen. Klik på … af oneToOneMappings.
For at tilføje mappingen til certifikatet skal vi eksportere den offentlige nøgle i klientcertifikatfilen. Du kan eksportere denne fra din Machine Management Console (tryk på Windows-knappen og søg efter mmc) Snap-in den lokale maskines certifikatets personlige lager og eksporter det klient ssl-certifikat, du vil bruge uden den private nøgle i base64-formatet. Med privat nøgle
Højreklik på det nyligt eksporterede certifikat, og åbn med notesblok. Fjern alle linjeskift i selve certifikatet.
Kopier det nu ind i certifikategenskabsfeltet i tilknytningen og udfyld resten
VIGTIGT: For at dette kan fungere, skal du indtaste et gyldigt brugernavn og password, og da min computer er serveren, vil legitimationsoplysningerne være et Windows-brugernavn og password.
Husk igen, at du skal anvende ændringerne.
Så er det nu, prøv det af og når du bliver bedt om at vælge det certifikat du har mappet til den bruger du lige har mappet.
Jeg håber du fandt dette indlæg brugbart og til mit næste indlæg vil jeg gennemgå hvordan man bruger selv signerede certifikater sammen med Windows Azure og hvordan man konfigurerer IIS ved hjælp af C# kode, tag et kig på det her: 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/
Have a good one =)