Zakładam, że przeczytałeś mój poprzedni post o tym, jak tworzyć samodzielnie podpisane certyfikaty dla rozwoju i być może zostawiłeś go myśląc „Świetnie! …. Ale jak właściwie ich używać?”. Ten wpis na blogu zabierze Cię krok po kroku przez ręczny proces konfiguracji IIS na komputerze lub serwerze Windows, aby użyć certyfikatów podpisanych przez siebie wraz z uwierzytelnieniem mapowania certyfikatów klienta IIS.
Proszę zauważyć, że w moich przykładach używam mojego hostingu localhost i losowej nazwy domeny, ale można to zrobić na prawdziwym serwerze IIS, jeśli masz statyczny adres IP od dostawcy usług internetowych lub firmy hostingowej domeny, jak również skonfigurowany firewall, router itp. poprawnie, gdzie w końcu można wskazać nazwę domeny do tego adresu. ALE nie polecam żadnego z nich wraz z samopodpisanymi certyfikatami, chyba że Twoi klienci/użytkownicy są gotowi do otrzymania i zainstalowania samopodpisanego certyfikatu głównego i klienta. Dobrym przykładem jest zamknięty intranet, gdzie masz dostęp do wszystkich komputerów użytkowników końcowych, ponieważ wtedy możesz zainstalować certyfikaty na ich maszynach, co jest konieczne, jeśli nie chcesz, aby Twoi użytkownicy otrzymali duże, grube ostrzeżenie o problemach z zaufaniem do samopodpisanego certyfikatu serwera. Jeśli szukasz rozwiązania nadającego się do produkcji komercyjnej, powinieneś kupić certyfikaty zamiast podpisywać je samodzielnie. Więc teraz mamy to z drogi, używam komputera z Windows 8.1 Pro, IIS 8.5 i Visual Studio Premium 2013. (Testowałem również z Windows Server 2012 R2 Hyper-V VM na moim komputerze).
Instalacja IIS
Jeśli nie zainstalowałeś jeszcze IIS na komputerze, który będzie działał jako serwer hostingowy, zrób to naciskając przycisk Windows na komputerze i wyszukaj „Włącz lub wyłącz funkcje Windows” (lub przejdź do Panelu sterowania i wyszukaj). Sprawdź Internetowe Usługi Informacyjne i następujące węzły podrzędne.
(Jeśli pracujesz na .NET 3.5 musisz sprawdzić .NET Extensibility 3.5 i ASP.NET 3.5)
Dla Windows Server 2012 przejdź do pulpitu menedżera serwera ➜ Kliknij dodaj role i funkcje ➜ Wybierz instalację opartą na rolach lub funkcjach i przejdź daleji przejdź dalej ➜ Wybierz serwer ➜ Włącz rolę serwera o nazwie Web Server (IIS) i następujące elementy potomne
Upewnij się również, że zaznaczono opcję Application Development (Rozwój aplikacji) z następującymi elementami potomnymi
Kliknij przycisk OK i pozwól systemowi Windows na instalację.
Tworzenie naszego przykładowego projektu
Dla celów tego demo stworzymy naprawdę prostą mini aplikację, którą będziemy hostować w lokalnym IIS. (Możesz też po prostu rozwidlić moją bezpośrednio na Githubie)
W Visual Studio, stwórz nową pustą aplikację webową i odwołaj się do web api
Będziemy potrzebować naprawdę prostego kontrolera:
using System.Web.Http;namespace IISWithCertificatesSample.WebApi.Controllers{ public class CatsController : ApiController { public IHttpActionResult Get() { return Ok("A lot of cats meowing for food"); } }}
Powinieneś teraz być w stanie uruchomić obie trasy (F5) i surfować do adresu url localhost z /api/cats (mój wygląda jak http://localhost:62172/api/cats). Wspaniale, pozwól nam hostować tę aplikację używając naszego lokalnego IIS.
UWAGA: Nie będziemy już uruchamiać aplikacji bezpośrednio z Visual Studio (F5), które jest ustawione na używanie IIS Express.
Konfigurowanie IIS
Otwórz Menedżera IIS (przycisk Windows + szukaj). Dodaj nową witrynę i pulę aplikacji z naszą przykładową aplikacją. (Kliknij prawym przyciskiem myszy na Sites ➜ Add Website) Ścieżka musi być folderem, w którym znajdują się dokumenty twojej strony internetowej, więc jeśli opublikowałeś swoją stronę wskaż tam ścieżkę. Zamierzam po prostu użyć bezpośredniej ścieżki do projektu w Visual Studio dla tego bardzo prostego przykładu.
Teraz pozwól nam lokalnie hostować tę witrynę, określając nazwę hosta AKA. nazwa domeny.
Ponieważ tylko hostuję lokalnie, muszę dodać stronę do mojego lokalnego pliku hosts, aby powiązać mój adres IP localhost z nazwą hosta. Odbywa się to poprzez uruchomienie Notatnika jako administrator i otwarcie pliku hosts w ścieżce: %systemroot%System32drivers
Dodając następujące na końcu: 127.0.0.1 yourdomain.com www.yourdomain.com
Teraz za każdym razem, gdy wejdę na stronę yourdomain.com i www.yourdomain.com na mojej maszynie, rozwiąże ona witrynę z moimi nowo dodanymi wiązaniami do adresu IP 127.0.0.1 (który jest IP localhost).
Dodajmy wiązanie www. bindowanie do swojej strony również w IIS Managerze
Surfuj na nazwę domeny, którą ustawiłeś w bindingu z www lub bez www. i dodaj końcówkę /api/cats i powinieneś dostać miauczące koty. (Jeśli nie, spróbuj opróżnić cache)
WAŻNE: To się stanie TYLKO na lokalnej maszynie, ponieważ zmieniliśmy plik hosts, aby przekierować nasze żądania nazwy domeny, którą dodaliśmy do adresu IP localhost. To jest przeznaczone dla rozwoju i być w stanie przetestować swoje zmiany przed wdrożeniem ich do prawdziwego serwera hostingowego.
Zabezpieczanie serwera za pomocą SSL
Teraz chcemy zabezpieczyć koty poprzez dodanie certyfikatu SSL do naszego serwera.
W swoim menedżerze IIS przejdź do swojego serwera (Góra drzewa po lewej stronie) ➜ Przewiń w dół i kliknij dwukrotnie na Certyfikaty serwera.
(Jeśli twój samodzielnie podpisany certyfikat jest już tutaj, przejdź do kroków wiązania)
Musimy zaimportować nasz samodzielnie podpisany certyfikat serwera, aby umożliwić komunikację https z SSL, więc kliknij Importuj…
Kliknij … i znajdź swój plik .pfx, wpisz hasło (parametr -po w twoim pliku wsadowym komendy) i kliknij OK
Twój certyfikat jest teraz dodany
Kliknij dwukrotnie nowo dodany cert, aby sprawdzić, czy jest zaufany (Twoje samodzielnie podpisane certyfikaty zostały dodane do właściwych sklepów w moim poprzednim poście, więc jeszcze raz: przeczytaj go, jeśli jesteś teraz zagubiony ;-))
So far, so good! Teraz możemy dodać wiązanie https, w ten sam sposób jak poprzednio, ale wybieramy https z portem 443, naszą domenę jako nazwę hosta i znajdujemy nasz samodzielnie podpisany certyfikat w rozwijanej liście
Zaznaczamy pole Server Name Indication, które umożliwia naszemu serwerowi posiadanie wielu certyfikatów zainstalowanych na tym samym adresie IP poprzez wysłanie nazwy hosta z pierwszym etapem handshake’u SSL. Powtórz te same kroki, aby dodać SSL dla www.yourdomain.com, ale z certyfikatem, w którym nazwa CN pasuje do nazwy domeny lub certyfikatem wieloznacznym
Nasze wiązania są na razie kompletne
Tadaa, możesz teraz użyć https://yourdomain.com/api/cats i https://www.yourdomain.com/api/cats
UWAGA: Firefox nie używa sklepu z certyfikatami Windows, więc będziesz musiał dodać swój główny CA ręcznie. Przejdź do ustawień Firefoksa ➜ Opcje ➜ Zaawansowane ➜ Wyświetl certyfikaty ➜ Władze ➜ Zaimportuj swój plik CARoot.cer
Uwierzytelnianie mapowania certyfikatu klienta IIS
Prześledziliśmy już zastosowania certyfikatu głównego i serwera i pewnie zastanawiasz się, co zrobić z certyfikatem klienta, który również stworzyliśmy w poprzednim poście. Jest to przydatne w sytuacjach, gdy na przykład potrzebujemy uwierzytelnić klienta bez logowania i hasła, ale raczej chcemy, aby serwer poprosił klienta o pokazanie certyfikatu i jeśli jest on poprawny, klient zostanie wpuszczony. Można to zrobić za pomocą mapowania Many-To-One lub One-To-One i pokażę jak to zrobić ręcznie w IIS Managerze.
Najpierw musimy zainstalować funkcję, więc przywołaj „Włącz lub wyłącz funkcje Windows” ponownie i zainstaluj następujące
Powiemy naszemu serwerowi, aby wymagał certyfikatu SSL od klienta
Następnie musimy skonfigurować serwer, aby wiedział, który certyfikat klienta musi zatwierdzić, więc przejdź do Edytora Konfiguracji i wybierz sekcję iisClientCertificateMappingAuthentication (możesz też wpisać ścieżkę systemową.webServer/security/authentication/iisClientCertificateMappingAuthentication w polu Section)
Many-To-One Mappings
Jeśli chcesz zmapować wiele certyfikatów klienta do jednego użytkownika, to podejście jest tym, czego potrzebujesz. Możesz również współdzielić certyfikaty klienta w ten sposób, instalując certyfikat klienta (i CA Root, ponieważ mamy certyfikat samopodpisujący się) na innych użytkownikach na dowolnej maszynie, aby uzyskać dostęp, o ile certyfikat klienta spełnia kryteria reguły mapowania. Byłoby to na przykład użyteczne w sytuacji, gdy chcielibyśmy, aby wszyscy użytkownicy w organizacji uzyskali dostęp poprzez jedno mapowanie użytkownika.
Włącz uwierzytelnianie mapowania certyfikatu klienta
Aby dodać mapowanie kliknij na … of the manyToOneMappings
Tutaj dodajesz użytkowników, którym chcesz przyznać dostęp.
Wypełnij właściwości mapowania i powtórz dla każdego użytkownika, którego chcesz skonfigurować do dostępu lub odmowy. Pamiętaj, że potrzebujesz certyfikatu klienta i certyfikatu głównego CA zainstalowanego na wszystkich mmc użytkownika.
WAŻNE: Aby to działało, musisz wpisać poprawną nazwę użytkownika i hasło, a ponieważ mój komputer jest serwerem, poświadczeniami będą moja nazwa użytkownika Windows i hasło.
Teraz musimy utworzyć kilka reguł do tego mapowania, aby serwer mógł określić, czy klient jest dozwolony, czy nie. To jest tak więc kliknij na właściwość rules i przycisk …
Dodam jedną regułę jako przykład, gdzie serwer sprawdzi certyfikat klienta, aby zobaczyć, czy jest on podpisany przez właściwy CA root. Proszę kontynuować i dodać więcej reguł dla większego bezpieczeństwa, proszę odwiedzić referencję IIS Many-To-One Mapping po więcej dokumentacji.
Pamiętaj, aby zastosować zmiany w Menedżerze IIS, więc zamknij okna reguł i mapowań i kliknij Zastosuj
Otwórz nowe okno przeglądarki incognito, aby upewnić się, że zaczynasz od czystego konta cache i cookie-wise i wprowadź swój adres url z /api/cats i zobacz, że przeglądarka prosi o certyfikat. Wybierz ClientCert i kliknij ok, aby uzyskać dostęp do kotów.
Jeśli to nie działa upewnij się, że Twój certyfikat klienta jest w Twoim sklepie CurrentUser/Personal jak również w sklepie z certyfikatami Twojej przeglądarki. Jeśli tak, to przejdź do Panelu sterowania ➜ Opcje internetowe ➜ Zawartość i kliknij Wyczyść stan SSL.
Otwórz nowe okno incognito i spróbuj ponownie, Twoja przeglądarka powinna teraz poprosić Cię o certyfikat klienta.
UWAGA: Pamiętaj, jak wyjaśniłem wcześniej, Firefox ma swój własny magazyn certyfikatów, więc musisz zaimportować certyfikat klienta do „Your Certificates”, aby użyć tego.
One-To-One Mappings
Przejrzyjmy się również mapowaniu jeden do jednego. Takie podejście oznacza, że potrzebujemy indywidualnego certyfikatu klienta dla każdego mapowania użytkownika. Możesz albo wyłączyć mapowanie many-to-one i używać tego samego certyfikatu i użytkownika, albo stworzyć nowe. Wróć do Edytora Konfiguracji i ponownie otwórz sekcję iisClientCertificateMappingAuthentication. Kliknij przycisk … mapowania oneToOneMappings.
Aby dodać mapowanie do certyfikatu musimy wyeksportować klucz publiczny pliku certyfikatu klienta. Można go wyeksportować z konsoli zarządzania maszyną (naciśnij przycisk Windows i wyszukaj mmc) Snap-in the Local Machine’s Certificate’s personal store i wyeksportuj certyfikat ssl klienta, którego chcesz użyć bez klucza prywatnego w formacie base64.
Kliknij prawym przyciskiem myszy na nowo wyeksportowany certyfikat i otwórz go w notatniku. Usuń wszystkie odstępy między wierszami w samym certyfikacie.
Teraz skopiuj to do pola właściwości certyfikatu w mapowaniu i wypełnij resztę
WAŻNE: Aby to zadziałało, musisz wprowadzić poprawną nazwę użytkownika i hasło, a ponieważ mój komputer jest serwerem, poświadczeniami będą nazwa użytkownika i hasło systemu Windows.
Ponownie, pamiętaj, aby zastosować zmiany.
I proszę bardzo, wypróbuj to i kiedy pojawi się monit wybierz certyfikat, który zmapowałeś do użytkownika, którego właśnie zmapowałeś.
Mam nadzieję, że znalazłeś ten post przydatny i w moim następnym poście będę przechodził przez to jak używać samopodpisanych certyfikatów razem z Windows Azure i jak skonfigurować IIS przez kod C#, spójrz na to tutaj: 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 =)
.