Ich gehe jetzt davon aus, dass Sie meinen vorherigen Beitrag über die Erstellung von selbstsignierten Zertifikaten für die Entwicklung gelesen haben und vielleicht gedacht haben: „Ja, toll! ….Aber wie benutze ich sie eigentlich?“. Dieser Blog-Beitrag wird Sie Schritt für Schritt durch den manuellen Prozess der Konfiguration von IIS auf Ihrem PC oder Windows Server führen, um Ihre selbstsignierten Zertifikate zusammen mit der IIS-Client-Zertifikat-Mapping-Authentifizierung zu verwenden.
Bitte beachten Sie, dass ich in meinen Beispielen mein localhost-Hosting und einen zufälligen Domänennamen verwende, aber Sie können dies auf dem IIS Ihres echten Servers tun, wenn Sie eine statische IP-Adresse von Ihrem Internet-Service-Provider oder Ihrer Domänen-Hosting-Firma haben sowie Ihre Firewall, Ihren Router usw. richtig konfiguriert haben, wo Sie schließlich Ihren Domänennamen auf diese Adresse zeigen können. ABER ich würde beides nicht zusammen mit selbstsignierten Zertifikaten empfehlen, es sei denn, Ihre Kunden/Benutzer sind bereit, Ihr selbstsigniertes Root- und Client-Zertifikat zu erhalten und zu installieren. Ein gutes Beispiel hierfür ist ein geschlossenes Intranet, in dem Sie Zugang zu allen Computern der Endbenutzer haben, denn dann können Sie die Zertifikate auf deren Computern installieren, was notwendig ist, wenn Sie nicht wollen, dass Ihre Benutzer eine dicke fette Warnung über Vertrauensprobleme mit Ihrem selbstsignierten Serverzertifikat erhalten. Wenn Sie eine kommerzielle, produktionstaugliche Lösung suchen, sollten Sie Ihre Zertifikate kaufen, anstatt sie selbst zu signieren. Nachdem das nun geklärt ist, verwende ich einen PC mit Windows 8.1 Pro, IIS 8.5 und Visual Studio Premium 2013. (Ich habe auch mit einer Windows Server 2012 R2 Hyper-V VM auf meinem PC getestet).
Installation von IIS
Wenn Sie IIS noch nicht auf dem Rechner installiert haben, der als Hosting-Server fungieren wird, tun Sie dies bitte, indem Sie die Windows-Taste für einen PC drücken und „Windows-Funktionen ein- oder ausschalten“ suchen (oder gehen Sie zur Systemsteuerung und suchen). Überprüfen Sie die Internetinformationsdienste und die folgenden Kindknoten.
(Wenn Sie mit .NET 3.5 arbeiten, müssen Sie die .NET Extensibility 3.5 und ASP.NET 3.5)
Für Windows Server 2012 gehen Sie zum Server Manager Dashboard ➜ Klicken Sie auf Rollen und Features hinzufügen ➜ Wählen Sie rollenbasierte oder feature-basierte Installation und gehen Sie weiter ➜ Wählen Sie den Server aus ➜ Aktivieren Sie die Serverrolle namens Webserver (IIS) und die folgenden untergeordneten Elemente
Auch stellen Sie sicher, dass Anwendungsentwicklung mit den folgenden untergeordneten Elementen aktiviert ist
Klicken Sie auf OK und lassen Sie Windows installieren.
Erstellen unseres Beispielprojekts
Für diese Demo erstellen wir eine wirklich einfache Mini-Anwendung, die wir im lokalen IIS hosten werden. (Sie können meine Anwendung auch direkt bei Github forken)
Erstellen Sie in Visual Studio eine neue leere Webanwendung und referenzieren Sie web api
Wir brauchen nur einen gaaanz einfachen 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"); } }}
Sie sollten nun in der Lage sein, beide Routen (F5) auszuführen und mit /api/cats zur localhost url zu surfen (meine sieht aus wie http://localhost:62172/api/cats). Super, jetzt können wir diese Anwendung mit unserem lokalen IIS hosten.
Hinweis: Wir werden die Anwendung nicht mehr direkt von Visual Studio (F5) ausführen, das auf die Verwendung von IIS Express eingestellt ist.
IIS konfigurieren
Öffnen Sie den IIS-Manager (Windows-Taste + Suche danach). Fügen Sie eine neue Website und einen Anwendungspool mit unserer Beispielanwendung hinzu. (Rechtsklick auf Sites ➜ Website hinzufügen) Der Pfad muss der Ordner sein, in dem sich Ihre Website-Dokumente befinden, wenn Sie also Ihre Website veröffentlicht haben, geben Sie den Pfad dort an. Für dieses sehr einfache Beispiel verwende ich den direkten Pfad zum Projekt in Visual Studio.
Lassen Sie uns nun diese Website lokal hosten, indem wir den Hostnamen, auch bekannt als Ihr Domainname, angeben.
Da ich nur lokal hoste, muss ich die Site zu meiner lokalen hosts-Datei hinzufügen, um meine localhost IP-Adresse mit dem Hostnamen zu verbinden. Dies geschieht, indem ich Notepad als Administrator ausführe und die Hosts-Datei im Pfad: %systemroot%\System32\drivers\etc
hinzu füge ich folgendes am Ende ein: 127.0.0.1 yourdomain.com www.yourdomain.com
Wenn ich nun auf meinem Rechner zu yourdomain.com und www.yourdomain.com surfe, wird die Site mit meinen neu hinzugefügten Bindungen zur 127.0.0.1 IP-Adresse (die die IP von localhost ist) aufgelöst.
Fügen wir die www.
Surfen Sie zu dem Domainnamen, den Sie in den Bindings mit oder ohne www. eingerichtet haben und fügen Sie die Endung /api/cats hinzu und Sie sollten die miauenden Katzen bekommen. (Falls nicht, versuchen Sie, den Cache zu leeren)
WICHTIG: Dies geschieht NUR auf dem lokalen Rechner, da wir die hosts-Datei so geändert haben, dass unsere Anfragen des Domainnamens, den wir hinzugefügt haben, auf die localhost-IP-Adresse umgeleitet werden. Es ist für die Entwicklung gedacht und um Ihre Änderungen zu testen, bevor Sie sie auf Ihrem echten Webhosting-Server einsetzen.
Sichern Sie den Server mit SSL
Jetzt wollen wir die Katzen sichern, indem wir ein SSL-Zertifikat zu unserem Server hinzufügen.
Gehen Sie in Ihrem IIS-Manager zu Ihrem Server (oben in der Baumstruktur auf der linken Seite) ➜ Blättern Sie nach unten und doppelklicken Sie auf Serverzertifikate.
(Wenn Ihr selbstsigniertes Zertifikat bereits hier ist, springen Sie zu den Bindungsschritten)
Wir müssen unser selbstsigniertes Serverzertifikat importieren, um die https-Kommunikation mit SSL zu ermöglichen, also klicken Sie auf Importieren…
Klicken Sie auf … und suchen Sie Ihre .pfx-Datei, geben Sie das Passwort ein (der -po-Parameter in Ihrer Befehls-Batch-Datei) und klicken Sie auf OK
Ihr Zertifikat ist nun hinzugefügt
Doppelklicken Sie auf das neu hinzugefügte Zertifikat, um zu überprüfen, ob es vertrauenswürdig ist (Ihre selbst signierten Zertifikate wurden in meinem vorherigen Beitrag zu den richtigen Speichern hinzugefügt, also noch einmal: Lies ihn, wenn du dich jetzt verirrt hast ;-))
So weit, so gut! Jetzt können wir die https-Bindung hinzufügen, auf die gleiche Weise wie zuvor, aber wählen Sie https mit Port 443, Ihre Domain als Hostname und suchen Sie Ihr selbst signiertes Zertifikat in der Dropdown-Liste
Kreuzen Sie das Kästchen Server Name Indication an, das es unserem Server ermöglicht, mehrere Zertifikate auf derselben IP-Adresse zu installieren, indem der Hostname mit der ersten Stufe des SSL-Handshakes gesendet wird. Wiederholen Sie die gleichen Schritte, um SSL für www.yourdomain.com hinzuzufügen, aber mit einem Zertifikat, bei dem der CN-Name mit dem Domainnamen übereinstimmt, oder mit einem Wildcard-Zertifikat
Unsere Bindungen sind jetzt vollständig
Tadaa, Sie können jetzt https://yourdomain.com/api/cats und https://www.yourdomain.com/api/cats
HINWEIS: Firefox verwendet nicht den Windows-Zertifikatspeicher, daher müssen Sie Ihre Root-CA manuell hinzufügen. Gehen Sie zu Firefox-Einstellungen ➜ Optionen ➜ Erweitert ➜ Zertifikate anzeigen ➜ Zertifizierungsstellen ➜ importieren Sie Ihre CARoot.cer-Datei
IIS-Client-Zertifikat-Mapping-Authentifizierung
Wir haben nun die Verwendungszwecke der Root- und Server-Zertifikate durchgesprochen und Sie fragen sich wahrscheinlich, was wir mit dem Client-Zertifikat machen sollen, das wir in meinem vorherigen Beitrag ebenfalls erstellt haben. Dies ist für Situationen gedacht, in denen wir z.B. Clients ohne Benutzeranmeldung und Passwort authentifizieren müssen, sondern der Server den Client auffordern soll, sein Zertifikat zu zeigen, und wenn es das richtige ist, wird der Client eingelassen. Dies kann mit einer Many-To-One- oder einer One-To-One-Zuordnung geschehen, und ich werde Ihnen zeigen, wie Sie beides manuell im IIS-Manager durchführen können.
Zuerst müssen wir das Feature installieren, also rufen Sie wieder die „Windows Features ein- oder ausschalten“ auf und installieren Sie folgendes
Wir sagen unserem Server, dass er ein SSL-Zertifikat vom Client benötigt
Dann müssen wir den Server so konfigurieren, dass er weiß, welches Client-Zertifikat er validieren muss, Gehen Sie also zum Konfigurationseditor und wählen Sie den Abschnitt iisClientCertificateMappingAuthentication (Sie können auch den Pfad system.webServer/security/authentication/iisClientCertificateMappingAuthentication in das Feld Section eingeben)
Many-To-One Mappings
Wenn Sie mehrere Client-Zertifikate einem einzelnen Benutzer zuordnen wollen, ist dieser Ansatz genau das Richtige. Sie können Client-Zertifikate auf diese Weise auch gemeinsam nutzen, indem Sie das Client-Zertifikat (und das CA-Root-Zertifikat, da wir ein selbstsignierendes Zertifikat verwenden) auf anderen Benutzern installieren, egal auf welchem Rechner, solange das Client-Zertifikat den Regelkriterien der Zuordnung entspricht. Es wäre zum Beispiel in einer Situation nützlich, in der Sie möchten, dass alle Benutzer in einer Organisation über eine einzige Benutzerzuordnung Zugriff erhalten.
Aktivieren Sie die Client-Zertifikat-Zuordnungsauthentifizierung
Um eine Zuordnung hinzuzufügen, klicken Sie auf das … der manyToOneMappings
Hier fügen Sie die Benutzer hinzu, denen Sie Zugriff gewähren möchten.
Füllen Sie die Eigenschaften für ein Mapping aus und wiederholen Sie den Vorgang für jeden Benutzer, dem Sie den Zugang gewähren oder verweigern möchten. Denken Sie daran, dass Sie das Client-Zertifikat und das Root-CA-Zertifikat auf allen mmc des Benutzers installieren müssen.
WICHTIG: Damit dies funktioniert, müssen Sie einen gültigen Benutzernamen und ein gültiges Kennwort eingeben, und da mein Computer der Server ist, werden die Anmeldedaten mein Windows-Benutzername und mein Kennwort sein.
Jetzt müssen wir einige Regeln für diese Zuordnung erstellen, damit der Server bestimmen kann, ob ein Client zugelassen wird oder nicht. Klicken Sie also auf die Eigenschaft rules und die Schaltfläche …
Ich werde eine Regel als Beispiel hinzufügen, bei der der Server das Client-Zertifikat überprüft, um zu sehen, ob es von der richtigen CA-Root signiert ist. Für mehr Sicherheit können Sie weitere Regeln hinzufügen. Weitere Informationen finden Sie in der IIS Many-To-One Mapping Referenz.
Erinnern Sie sich daran, die Änderungen im IIS-Manager anzuwenden, schließen Sie also die Fenster für Regeln und Zuordnungen und klicken Sie auf Anwenden
Öffnen Sie ein neues Inkognito-Browser-Fenster, um sicherzugehen, dass Sie mit einem sauberen Cache und Cookie beginnen, und geben Sie Ihre URL mit /api/cats ein und sehen Sie, wie der Browser Sie nach einem Zertifikat fragt. Wählen Sie das ClientCert und klicken Sie auf ok, um Zugriff auf die Katzen zu erhalten.
Wenn dies nicht funktioniert, vergewissern Sie sich, dass sich Ihr Client-Zertifikat sowohl in Ihrem CurrentUser/Personal Store als auch im Zertifikatspeicher Ihres Browsers befindet. Wenn ja, dann gehen Sie zu Systemsteuerung ➜ Internetoptionen ➜ Inhalt und klicken Sie auf SSL-Status löschen.
Öffnen Sie ein neues Inkognito-Fenster und versuchen Sie es erneut, Ihr Browser sollte Sie nun nach dem Client-Zertifikat fragen.
HINWEIS: Wie ich bereits erklärt habe, hat Firefox einen eigenen Zertifikatspeicher, so dass Sie das Client-Zertifikat in „Ihre Zertifikate“ importieren müssen, um es zu verwenden.
One-To-One Mappings
Lassen Sie uns auch durch die One-to-One Mappings gehen. Dieser Ansatz bedeutet, dass wir für jede Benutzerzuordnung ein eigenes Client-Zertifikat benötigen. Sie können entweder die Eins-zu-Eins-Zuordnung deaktivieren und das gleiche Zertifikat und den gleichen Benutzer verwenden oder neue Zuordnungen erstellen. Gehen Sie zurück zum Konfigurationseditor und öffnen Sie erneut den Abschnitt iisClientCertificateMappingAuthentication. Klicken Sie auf das Feld … der oneToOneMappings.
Um das Mapping zum Zertifikat hinzuzufügen, müssen wir den öffentlichen Schlüssel der Client-Zertifikatsdatei exportieren. Sie können dies von Ihrer Maschinenverwaltungskonsole aus exportieren (drücken Sie die Windows-Taste und suchen Sie nach mmc). Rufen Sie den persönlichen Speicher des Zertifikats der lokalen Maschine auf und exportieren Sie das Client-SSL-Zertifikat, das Sie verwenden möchten, ohne den privaten Schlüssel im base64-Format.
Klicken Sie mit der rechten Maustaste auf das neu exportierte Zertifikat und öffnen Sie es mit Notepad. Entfernen Sie alle Zeilenumbrüche im Zertifikat selbst.
Kopieren Sie das nun in das Zertifikatseigenschaftsfeld der Zuordnung und füllen Sie den Rest aus
WICHTIG: Damit dies funktioniert, müssen Sie einen gültigen Benutzernamen und ein Kennwort eingeben, und da mein Computer der Server ist, werden die Anmeldedaten ein Windows-Benutzername und ein Kennwort sein.
Erinnern Sie sich wieder daran, die Änderungen anzuwenden.
Und los geht’s, probieren Sie es aus und wenn Sie dazu aufgefordert werden, wählen Sie das Zertifikat, das Sie dem Benutzer zugewiesen haben, den Sie gerade zugewiesen haben.
Ich hoffe, Sie haben diesen Beitrag nützlich gefunden und in meinem nächsten Beitrag werde ich durchgehen, wie man selbstsignierte Zertifikate zusammen mit Windows Azure verwendet und wie man den IIS mit C#-Code konfiguriert, schauen Sie es sich hier an: 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/
Schönen Tag noch =)