Praca z certyfikatami
Aby programować zabezpieczenia programu Windows Communication Foundation (WCF), certyfikaty cyfrowe X.509 są często używane do uwierzytelniania klientów i serwerów, szyfrowania i cyfrowo podpisywania komunikatów. W tym temacie krótko opisano funkcje certyfikatów cyfrowych X.509 i sposób ich używania w programie WCF oraz zawiera linki do tematów wyjaśniających te pojęcia lub pokazujących sposób wykonywania typowych zadań przy użyciu programu WCF i certyfikatów.
Krótko mówiąc, certyfikat cyfrowy jest częścią infrastruktury kluczy publicznych (PKI), która jest systemem certyfikatów cyfrowych, urzędów certyfikacji i innych urzędów rejestracyjnych, które weryfikują i uwierzytelniają ważność każdej strony zaangażowanej w transakcję elektroniczną za pomocą kryptografii klucza publicznego. Urząd certyfikacji wystawia certyfikaty, a każdy certyfikat ma zestaw pól zawierających dane, takie jak podmiot (jednostka, do której wystawiono certyfikat), daty ważności (gdy certyfikat jest ważny), wystawca (jednostka, która wystawiła certyfikat) i klucz publiczny. W programie WCF każda z tych właściwości jest przetwarzana jako Claim, a każde oświadczenie jest dalej podzielone na dwa typy: tożsamość i prawo. Aby uzyskać więcej informacji na temat certyfikatów X.509, zobacz X.509 Public Key Certificates (Certyfikaty kluczy publicznych X.509). Aby uzyskać więcej informacji na temat oświadczeń i autoryzacji w programie WCF, zobacz Zarządzanie oświadczeniami i autoryzacją za pomocą modelu tożsamości. Aby uzyskać więcej informacji na temat implementowania infrastruktury kluczy publicznych, zobacz Enterprise PKI with Windows Server 2012 R2 Active Directory Certificate Services (Infrastruktury kluczy publicznych przedsiębiorstwa z usługami certyfikatów Active Directory w systemie Windows Server 2012 R2).
Podstawową funkcją certyfikatu jest uwierzytelnienie tożsamości właściciela certyfikatu innym osobom. Certyfikat zawiera klucz publiczny właściciela, a właściciel zachowuje klucz prywatny. Klucz publiczny może służyć do szyfrowania komunikatów wysyłanych do właściciela certyfikatu. Tylko właściciel ma dostęp do klucza prywatnego, więc tylko właściciel może odszyfrować te komunikaty.
Certyfikaty muszą być wystawiane przez urząd certyfikacji, który jest często wystawcą certyfikatów innej firmy. W domenie systemu Windows znajduje się urząd certyfikacji, który może służyć do wystawiania certyfikatów komputerom w domenie.
Wyświetlanie certyfikatów
Aby pracować z certyfikatami, często trzeba je wyświetlić i sprawdzić ich właściwości. Można to łatwo zrobić za pomocą narzędzia przystawki programu Microsoft Management Console (MMC). Aby uzyskać więcej informacji, zobacz How to: View Certificates with the MMC Snap-in (Instrukcje: wyświetlanie certyfikatów za pomocą przystawki MMC).
Magazyny certyfikatów
Certyfikaty znajdują się w sklepach. Istnieją dwie główne lokalizacje magazynów, które są dalej podzielone na pod stores. Jeśli jesteś administratorem na komputerze, możesz wyświetlić oba główne magazyny przy użyciu narzędzia przystawki MMC. Użytkownicy niebędący administratorami mogą wyświetlać tylko bieżący magazyn użytkowników.
Magazyn komputera lokalnego. Zawiera certyfikaty dostępne przez procesy maszyny, takie jak ASP.NET. Ta lokalizacja służy do przechowywania certyfikatów uwierzytelniających serwer na klientach.
Bieżący magazyn użytkowników. Aplikacje interakcyjne zazwyczaj umieszczają w tym miejscu certyfikaty dla bieżącego użytkownika komputera. Jeśli tworzysz aplikację kliencką, zazwyczaj umieszczasz certyfikaty, które uwierzytelniają użytkownika w usłudze.
Te dwa magazyny są dalej podzielone na pod stores. Najważniejsze z nich podczas programowania w programie WCF są następujące:
Zaufane główne urzędy certyfikacji. Za pomocą certyfikatów w tym magazynie można utworzyć łańcuch certyfikatów, który można prześledzić z powrotem do certyfikatu urzędu certyfikacji w tym magazynie.
Ważne
Komputer lokalny niejawnie ufa wszelkim certyfikatom umieszczonym w tym magazynie, nawet jeśli certyfikat nie pochodzi z zaufanego urzędu certyfikacji innej firmy. Z tego powodu nie umieszczaj żadnego certyfikatu w tym magazynie, chyba że w pełni ufasz wystawcy i rozumiesz konsekwencje.
Osobiste. Ten magazyn jest używany dla certyfikatów skojarzonych z użytkownikiem komputera. Zazwyczaj ten magazyn jest używany w przypadku certyfikatów wystawionych przez jeden z certyfikatów urzędu certyfikacji znajdujących się w magazynie zaufanych głównych urzędów certyfikacji. Alternatywnie certyfikat znaleziony tutaj może być wystawiony samodzielnie i zaufany przez aplikację.
Aby uzyskać więcej informacji na temat magazynów certyfikatów, zobacz Magazyny certyfikatów.
Wybieranie sklepu
Wybór miejsca przechowywania certyfikatu zależy od tego, jak i kiedy działa usługa lub klient. Obowiązują następujące reguły ogólne:
Jeśli usługa WCF jest hostowana w usłudze systemu Windows, użyj magazynu maszyn lokalnych. Należy pamiętać, że uprawnienia administratora są wymagane do zainstalowania certyfikatów w magazynie komputerów lokalnych.
Jeśli usługa lub klient jest aplikacją działającą na koncie użytkownika, użyj bieżącego magazynu użytkowników .
Magazyny programu Access
Magazyny są chronione przez listy kontroli dostępu (ACL), podobnie jak foldery na komputerze. Podczas tworzenia usługi hostowanej przez usługi Internet Information Services (IIS) proces ASP.NET jest uruchamiany na koncie ASP.NET. To konto musi mieć dostęp do magazynu zawierającego certyfikaty używane przez usługę. Każdy z głównych magazynów jest chroniony przy użyciu domyślnej listy dostępu, ale listy można modyfikować. Jeśli tworzysz oddzielną rolę w celu uzyskania dostępu do magazynu, musisz udzielić tej roli uprawnień dostępu. Aby dowiedzieć się, jak zmodyfikować listę dostępu przy użyciu narzędzia WinHttpCertConfig.exe, zobacz Instrukcje: tworzenie certyfikatów tymczasowych do użycia podczas programowania.
Łańcuch zaufania i urzędów certyfikacji
Certyfikaty są tworzone w hierarchii, w której każdy pojedynczy certyfikat jest połączony z urzędem certyfikacji, który wystawił certyfikat. Ten link jest linkiem do certyfikatu urzędu certyfikacji. Następnie certyfikat urzędu certyfikacji łączy się z urzędem certyfikacji, który wystawił certyfikat oryginalnego urzędu certyfikacji. Ten proces jest powtarzany do momentu osiągnięcia certyfikatu głównego urzędu certyfikacji. Certyfikat głównego urzędu certyfikacji jest z natury zaufany.
Certyfikaty cyfrowe są używane do uwierzytelniania jednostki, opierając się na tej hierarchii, nazywanej również łańcuchem zaufania. Łańcuch certyfikatów można wyświetlić przy użyciu przystawki MMC, klikając dwukrotnie dowolny certyfikat, a następnie klikając kartę Ścieżka certyfikatu. Aby uzyskać więcej informacji na temat importowania łańcuchów certyfikatów dla urzędu certyfikacji, zobacz How to: Specify the Certificate Authority Certificate Chain Used to Verify Signatures (Jak określić łańcuch certyfikatów urzędu certyfikacji używany do weryfikowania podpisów).
Uwaga
Każdy wystawca może być wyznaczony zaufanym urzędem głównym, umieszczając certyfikat wystawcy w magazynie certyfikatów zaufanego urzędu głównego.
Wyłączanie zaufania łańcucha
Podczas tworzenia nowej usługi może być używany certyfikat, który nie jest wystawiony przez zaufany certyfikat główny lub sam certyfikat wystawiający może nie znajdować się w magazynie zaufanych głównych urzędów certyfikacji. Tylko w celach programistycznych można tymczasowo wyłączyć mechanizm sprawdzający łańcuch zaufania dla certyfikatu. W tym celu ustaw CertificateValidationMode
właściwość na PeerTrust
wartość lub PeerOrChainTrust
. Tryb określa, że certyfikat może być wystawiony samodzielnie (relacja zaufania równorzędnego) lub część łańcucha zaufania. Właściwość można ustawić na dowolnej z następujących klas.
Właściwość można również ustawić przy użyciu konfiguracji. Następujące elementy służą do określania trybu weryfikacji:
Uwierzytelnianie niestandardowe
Właściwość CertificateValidationMode
umożliwia również dostosowanie sposobu uwierzytelniania certyfikatów. Domyślnie poziom jest ustawiony na ChainTrust
wartość . Aby użyć Custom wartości, należy również ustawić CustomCertificateValidatorType
atrybut na zestaw i typ używany do weryfikacji certyfikatu. Aby utworzyć niestandardowy moduł sprawdzania poprawności, należy dziedziczyć z klasy abstrakcyjnej X509CertificateValidator .
Podczas tworzenia niestandardowego wystawcy uwierzytelniania najważniejszą metodą zastąpienia jest Validate metoda . Przykład uwierzytelniania niestandardowego można znaleźć w przykładzie modułu sprawdzania poprawności certyfikatów X.509. Aby uzyskać więcej informacji, zobacz Niestandardowe poświadczenia i walidacja poświadczeń.
Użyj polecenia cmdlet New-SelfSignedCertificate programu PowerShell, aby utworzyć łańcuch certyfikatów
Polecenie cmdlet New-SelfSignedCertificate programu PowerShell tworzy certyfikaty X.509 i pary kluczy prywatnych/kluczy publicznych. Klucz prywatny można zapisać na dysku, a następnie użyć go do wystawiania i podpisywania nowych certyfikatów, symulując w ten sposób hierarchię certyfikatów łańcuchowych. Polecenie cmdlet jest przeznaczone tylko jako pomoc podczas tworzenia usług i nigdy nie powinno być używane do tworzenia certyfikatów na potrzeby rzeczywistego wdrożenia. Podczas tworzenia usługi WCF wykonaj następujące kroki, aby utworzyć łańcuch zaufania za pomocą polecenia cmdlet New-SelfSignedCertificate.
Utwórz tymczasowy certyfikat urzędu głównego (z podpisem własnym) przy użyciu polecenia cmdlet New-SelfSignedCertificate. Zapisz klucz prywatny na dysku.
Użyj nowego certyfikatu, aby wydać inny certyfikat zawierający klucz publiczny.
Zaimportuj certyfikat urzędu głównego do magazynu zaufanych głównych urzędów certyfikacji.
Aby uzyskać instrukcje krok po kroku, zobacz How to: Create Temporary Certificates for Use During Development (Instrukcje: tworzenie certyfikatów tymczasowych do użycia podczas programowania).
Którego certyfikatu należy użyć?
Typowe pytania dotyczące certyfikatów to certyfikaty, których należy używać i dlaczego. Odpowiedź zależy od tego, czy programujesz klienta, czy usługę. Poniższe informacje zawierają ogólne wytyczne i nie są wyczerpującą odpowiedzią na te pytania.
Certyfikaty usługi
Certyfikaty usługi mają podstawowe zadanie uwierzytelniania serwera na klientach. Jednym z początkowych testów, gdy klient uwierzytelnia serwer, jest porównanie wartości pola Podmiot z identyfikatorem URI (Uniform Resource Identifier) używanym do kontaktu z usługą: dns obu musi być zgodny. Jeśli na przykład identyfikator URI usługi to http://www.contoso.com/endpoint/
pole Podmiot musi również zawierać wartość www.contoso.com
.
Należy pamiętać, że pole może zawierać kilka wartości, z których każdy ma prefiks inicjalizacji, aby wskazać wartość. Najczęściej inicjowanie to "CN" dla nazwy pospolitej, na przykład CN = www.contoso.com
. Istnieje również możliwość , aby pole Podmiot było puste, w tym przypadku pole Alternatywna nazwa podmiotu może zawierać wartość Nazwa DNS.
Zwróć również uwagę, że wartość pola Zamierzone cele certyfikatu powinna zawierać odpowiednią wartość, taką jak "Uwierzytelnianie serwera" lub "Uwierzytelnianie klienta".
Certyfikaty klienta
Certyfikaty klienta nie są zwykle wystawiane przez urząd certyfikacji innej firmy. Zamiast tego magazyn osobisty bieżącej lokalizacji użytkownika zazwyczaj zawiera certyfikaty umieszczone tam przez urząd główny z zamierzonym celem "uwierzytelnianie klienta". Klient może używać takiego certyfikatu, gdy wymagane jest wzajemne uwierzytelnianie.
Odwołanie online i odwołanie w trybie offline
Ważność certyfikatu
Każdy certyfikat jest ważny tylko przez określony okres, nazywany okresem ważności. Okres ważności jest definiowany przez pola Ważny od i Ważny na pola certyfikatu X.509. Podczas uwierzytelniania certyfikat jest sprawdzany, aby określić, czy certyfikat jest nadal w okresie ważności.
Lista odwołania certyfikatów
W dowolnym momencie w okresie ważności urząd certyfikacji może odwołać certyfikat. Może się to zdarzyć z wielu powodów, takich jak naruszenie klucza prywatnego certyfikatu.
W takim przypadku wszystkie łańcuchy, które pochodzą z odwołanego certyfikatu, są również nieprawidłowe i nie są zaufane podczas procedur uwierzytelniania. Aby dowiedzieć się, które certyfikaty są odwoływane, każdy wystawca publikuje listę odwołania certyfikatów z sygnaturą godzinową i datą. Listę można sprawdzić przy użyciu odwołania online lub odwołania w trybie offline, ustawiając RevocationMode
właściwość lub DefaultRevocationMode
następujących klas na jedną z X509RevocationMode wartości wyliczania: X509ClientCertificateAuthentication, , X509PeerCertificateAuthenticationX509ServiceCertificateAuthenticationi IssuedTokenServiceCredential klasy. Wartość domyślna dla wszystkich właściwości to Online
.
Tryb konfiguracji można również ustawić przy użyciu revocationMode
atrybutu zarówno< uwierzytelniania> (<usługi ServiceBehaviors>) jak i <uwierzytelniania> (<punkt końcowyBehaviors).>
Metoda SetCertificate
W programie WCF często należy określić certyfikat lub zestaw certyfikatów, których usługa lub klient używa do uwierzytelniania, szyfrowania lub cyfrowego podpisywania komunikatu. Można to zrobić programowo przy użyciu SetCertificate
metody różnych klas reprezentujących certyfikaty X.509. Poniższe klasy używają SetCertificate
metody do określenia certyfikatu.
Metoda SetCertificate
działa przez wyznaczenie lokalizacji magazynu i magazynu, typu "znajdź" (x509FindType
parametr), który określa pole certyfikatu i wartość do znalezienia w polu. Na przykład poniższy kod tworzy ServiceHost wystąpienie i ustawia certyfikat usługi używany do uwierzytelniania usługi na klientach za SetCertificate
pomocą metody .
Uri baseAddress = new Uri("http://cohowinery.com/services");
ServiceHost sh = new ServiceHost(typeof(CalculatorService), baseAddress );
sh.Credentials.ServiceCertificate.SetCertificate(
StoreLocation.LocalMachine, StoreName.My,
X509FindType.FindBySubjectName, "cohowinery.com");
Dim baseAddress As New Uri("http://cohowinery.com/services")
Dim sh As New ServiceHost(GetType(CalculatorService), baseAddress)
sh.Credentials.ServiceCertificate.SetCertificate( _
StoreLocation.LocalMachine, StoreName.My, _
X509FindType.FindBySubjectName, "cohowinery.com")
Wiele certyfikatów o tej samej wartości
Magazyn może zawierać wiele certyfikatów o tej samej nazwie podmiotu. Oznacza to, że jeśli określisz, że parametr x509FindType
ma FindBySubjectName wartość lub FindBySubjectDistinguishedName, a więcej niż jeden certyfikat ma tę samą wartość, zostanie zgłoszony wyjątek, ponieważ nie ma możliwości odróżnienia wymaganego certyfikatu. Można temu zapobiec, ustawiając wartość na x509FindType
FindByThumbprint. Pole odcisku palca zawiera unikatową wartość, której można użyć do znalezienia określonego certyfikatu w magazynie. Jednak ma to własną wadę: jeśli certyfikat zostanie odwołany lub odnowiony, metoda nie powiedzie się, SetCertificate
ponieważ odcisk palca również zniknął. Lub jeśli certyfikat nie jest już prawidłowy, uwierzytelnianie nie powiedzie się. Aby temu zapobiec, należy ustawić x590FindType
parametr na FindByIssuerName i określić nazwę wystawcy. Jeśli żaden konkretny wystawca nie jest wymagany, możesz również ustawić jedną z pozostałych X509FindType wartości wyliczenia, na przykład FindByTimeValid.
Certyfikaty w konfiguracji
Certyfikaty można również ustawić przy użyciu konfiguracji. Jeśli tworzysz usługę, poświadczenia, w tym certyfikaty, są określone w obszarze serviceBehaviors>.< Podczas programowania klienta certyfikaty są określane w obszarze endpointBehaviors>.<
Mapuj certyfikat na konto użytkownika
Funkcja usług IIS i Active Directory to możliwość mapowania certyfikatu na konto użytkownika systemu Windows. Aby uzyskać więcej informacji na temat tej funkcji, zobacz Mapuj certyfikaty na konta użytkowników.
Aby uzyskać więcej informacji na temat używania mapowania usługi Active Directory, zobacz Mapowanie certyfikatów klienta za pomocą mapowania usługi katalogowej.
Po włączeniu MapClientCertificateToWindowsAccount tej funkcji można ustawić właściwość X509ClientCertificateAuthentication klasy na true
. W konfiguracji można ustawić mapClientCertificateToWindowsAccount
atrybut <elementu uwierzytelniania> na true
, jak pokazano w poniższym kodzie.
<serviceBehaviors>
<behavior name="MappingBehavior">
<serviceCredentials>
<clientCertificate>
<authentication certificateValidationMode="None" mapClientCertificateToWindowsAccount="true" />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
Mapowanie certyfikatu X.509 na token reprezentujący konto użytkownika systemu Windows jest uznawane za podniesienie uprawnień, ponieważ po zamapowaniu token systemu Windows może służyć do uzyskania dostępu do chronionych zasobów. W związku z tym zasady domeny wymagają, aby certyfikat X.509 był zgodny z zasadami przed mapowaniem. Pakiet zabezpieczeń SChannel wymusza to wymaganie.
W przypadku korzystania z programu .NET Framework w wersji 3.5 lub nowszej program WCF zapewnia, że certyfikat jest zgodny z zasadami domeny, zanim zostanie zamapowany na konto systemu Windows.
W pierwszej wersji programu WCF mapowanie odbywa się bez konsultacji z zasadami domeny. W związku z tym istnieje możliwość, że starsze aplikacje, które działały podczas uruchamiania w ramach pierwszej wersji, kończą się niepowodzeniem, jeśli mapowanie jest włączone, a certyfikat X.509 nie spełnia zasad domeny.