Kryptografia międzyplatformowa na platformie .NET
Operacje kryptograficzne na platformie .NET są wykonywane przez biblioteki systemu operacyjnego. Ta zależność ma zalety:
- Aplikacje platformy .NET korzystają z niezawodności systemu operacyjnego. Zapewnienie bezpieczeństwa bibliotek kryptograficznych przed lukami w zabezpieczeniach jest priorytetem dla dostawców systemu operacyjnego. W tym celu udostępniają aktualizacje, które powinni stosować administratorzy systemu.
- Aplikacje platformy .NET mają dostęp do algorytmów zweryfikowanych przez standard FIPS, jeśli biblioteki systemu operacyjnego są weryfikowane przez standard FIPS.
Zależność od bibliotek systemu operacyjnego oznacza również, że aplikacje platformy .NET mogą używać tylko funkcji kryptograficznych, które obsługuje system operacyjny. Chociaż wszystkie platformy obsługują pewne podstawowe funkcje, niektóre funkcje obsługiwane przez platformę .NET nie mogą być używane na niektórych platformach. W tym artykule opisano funkcje obsługiwane na każdej platformie.
W tym artykule założono, że masz współpracę z kryptografią na platformie .NET. Aby uzyskać więcej informacji, zobacz .NET Cryptography Model (Model kryptografii platformy .NET) i .NET Cryptographic Services (Usługi kryptograficzne platformy .NET).
Algorytmy uwierzytelniania skrótów i komunikatów
Wszystkie klasy algorytmu skrótu i uwierzytelniania komunikatów opartych na skrótach (HMAC), w tym *Managed
klasy, odroczają biblioteki systemu operacyjnego z wyjątkiem platformy .NET w przeglądarce WASM. W przeglądarce WASM, SHA-1, SHA-2-256, SHA-2-384, SHA-2-512 i odpowiedniki HMAC są implementowane przy użyciu kodu zarządzanego.
Algorytm | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android | Przeglądarka |
---|---|---|---|---|---|---|
MD5 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
SHA-1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
SHA-2-256 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
SHA-2-384 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
SHA-2-512 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
SHA-3-256 | Windows 11 Build 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
SHA-3-384 | Windows 11 Build 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
SHA-3-512 | Windows 11 Build 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
SHAKE-128 | Windows 11 Build 25324+ | OpenSSL 1.1.1+2 | ❌ | ❌ | ❌ | ❌ |
SHAKE-256 | Windows 11 Build 25324+ | OpenSSL 1.1.1+2 | ❌ | ❌ | ❌ | ❌ |
HMAC-MD5 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
HMAC-SHA-1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
HMAC-SHA-2-256 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
HMAC-SHA-2-384 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
HMAC-SHA-2-512 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
HMAC-SHA-3-256 | Windows 11 Build 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
HMAC-SHA-3-384 | Windows 11 Build 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
HMAC-SHA-3-512 | Windows 11 Build 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
KMAC-1281 | Windows 11 Build 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
KMAC-2561 | Windows 11 Build 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
KMAC-XOF-1281 | Windows 11 Build 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
KMAC-XOF-2561 | Windows 11 Build 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
1Dostępne począwszy od platformy .NET 9.
2Funkcja danych wyjściowych rozszerzalnych przesyłania strumieniowego (XOF) jest dostępna począwszy od platformy .NET 9. W systemie Linux wymaga to programu OpenSSL 3.3.
Szyfrowanie symetryczne
Podstawowe szyfry i łańcuchy są wykonywane przez biblioteki systemowe.
Szyfrowanie i tryb | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
AES-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
AES-EBC | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
AES-CFB8 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
AES-CFB128 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
3DES-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
3DES-EBC | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
3DES-CFB8 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
3DES-CFB64 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
DES-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
DES-EBC | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
DES-CFB8 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
RC2-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
RC2-EBC | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
RC2-CFB | ❌ | ❌ | ❌ | ❌ | ❌ |
Uwierzytelnione szyfrowanie
Obsługa szyfrowania uwierzytelnionego (AE) jest dostępna dla odpowiednio klas AES-CCM, AES-GCM i ChaCha20Poly1305 za pośrednictwem System.Security.Cryptography.AesCcmklas , System.Security.Cryptography.AesGcmi System.Security.Cryptography.ChaCha20Poly1305 .
Ponieważ uwierzytelnione szyfrowanie wymaga nowszych interfejsów API platformy do obsługi algorytmu, obsługa może nie być obecna na wszystkich platformach. Właściwość statyczna IsSupported
w klasach algorytmu może służyć do wykrywania w czasie wykonywania, jeśli bieżąca platforma obsługuje algorytm lub nie.
Szyfrowanie i tryb | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android | Przeglądarka |
---|---|---|---|---|---|---|
AES-GCM | ✔️ | ✔️ | ✔️ | ⚠️ | ✔️ | ❌ |
AES-CCM | ✔️ | ✔️ | ⚠️ | ❌ | ✔️ | ❌ |
ChaCha20Poly1305 | Windows 10 Build 20142+ | OpenSSL 1.1.0+ | ✔️ | ⚠️ | Poziom interfejsu API 28+ | ❌ |
Program AES-CCM w systemie macOS
W systemie macOS biblioteki systemowe nie obsługują programu AES-CCM dla kodu innej firmy, więc AesCcm klasa używa biblioteki OpenSSL do obsługi. Użytkownicy w systemie macOS muszą uzyskać odpowiednią kopię biblioteki OpenSSL (libcrypto), aby ten typ działał, i musi znajdować się w ścieżce, z którą system domyślnie załadowałby bibliotekę. Zalecamy zainstalowanie biblioteki OpenSSL z poziomu menedżera pakietów, takiego jak Homebrew.
Biblioteki libcrypto.0.9.7.dylib
i libcrypto.0.9.8.dylib
zawarte w systemie macOS pochodzą z wcześniejszych wersji bibliotek OpenSSL i nie będą używane. Biblioteki libcrypto.35.dylib
, libcrypto.41.dylib
i libcrypto.42.dylib
pochodzą z bibliotek LibreSSL i nie będą używane.
AES-GCM i ChaCha20Poly1305 w systemach iOS, tvOS i MacCatalyst
Obsługa usług AES-GCM i ChaCha20Poly1305 jest dostępna od platformy .NET 9 w systemach iOS i tvOS 13.0 i nowszych oraz we wszystkich wersjach programu MacCatalyst.
Klucze AES-CCM, elementy inne niż i tagi
Rozmiary kluczy
Program AES-CCM współpracuje z kluczami 128, 192 i 256-bitowymi.
Rozmiary niezwiązane
Klasa AesCcm obsługuje 56, 64, 72, 80, 88, 96 i 104-bitowe (7, 8, 9, 10, 11, 12 i 13-bajtowe).
Rozmiary tagów
Klasa AesCcm obsługuje tworzenie lub przetwarzanie 32, 48, 64, 80, 96, 112 i 128-bitowych (4, 8, 10, 12, 14 i 16 bajtów).
Klucze AES-GCM, elementy inne niż i tagi
Rozmiary kluczy
Usługa AES-GCM współpracuje z kluczami 128, 192 i 256-bitowymi.
Rozmiary niezwiązane
Klasa AesGcm obsługuje tylko 96-bitowe (12-bajtowe) elementy inne niż.
Rozmiary tagów w systemach Windows i Linux AesGcm klasa obsługuje tworzenie lub przetwarzanie tagów 96, 104, 112, 120 i 128-bitowych (12, 13, 14, 15 i 16 bajtów). Na platformach firmy Apple rozmiar tagu jest ograniczony do 128-bitowego (16 bajtów) ze względu na ograniczenia struktury CryptoKit.
ChaCha20Poly1305 keys, nonces i tags.
ChaCha20Poly1305 ma stały rozmiar klucza, innego niż i tag uwierzytelniania. ChaCha20Poly1305 zawsze używa 256-bitowego klucza, 96-bitowego (12-bajtowego) i 128-bitowego (16-bajtowego) tagu.
Kryptografia asymetryczna
Ta sekcja zawiera następujące podsekcje:
RSA
Generowanie kluczy RSA (Rivest–Shamir–Adleman) odbywa się przez biblioteki systemu operacyjnego i podlega ograniczeniom rozmiaru i cechom wydajności.
Operacje klucza RSA są wykonywane przez biblioteki systemu operacyjnego, a typy kluczy, które można załadować, podlegają wymaganiom systemu operacyjnego.
Platforma .NET nie uwidacznia operacji RSA "nieprzetworzonych" (nieprzetworzonych).
Obsługa uzupełniania i skrótów różni się w zależności od platformy:
Tryb uzupełniania | Windows (CNG) | Linux (OpenSSL) | macOS | iOS, tvOS, MacCatalyst | Android | Windows (CAPI) |
---|---|---|---|---|---|---|
Szyfrowanie PKCS1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
OAEP — SHA-1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
OAEP — SHA-2 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
OAEP — SHA-3 | Windows 11 Build 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
Podpis PKCS1 (MD5, SHA-1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Podpis PKCS1 (SHA-2) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ⚠✔1 |
Podpis PKCS1 (SHA-3) | Windows 11 Build 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
PSS | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
1 Windows CryptoAPI (CAPI) jest w stanie podpis PKCS1 z algorytmem SHA-2. Jednak pojedynczy obiekt RSA może zostać załadowany do dostawcy usług kryptograficznych (CSP), który go nie obsługuje.
RsA w systemie Windows
- Interfejs WINDOWS CryptoAPI (CAPI) jest używany zawsze, gdy
new RSACryptoServiceProvider()
jest używany. - Interfejs API kryptografii systemu Windows nowej generacji (CNG) jest używany za każdym razem, gdy
new RSACng()
jest używany. - Obiekt zwracany przez RSA.Create program jest wewnętrznie obsługiwany przez CNG systemu Windows. To użycie CNG systemu Windows jest szczegółem implementacji i może ulec zmianie.
- GetRSAPublicKey Metoda rozszerzenia dla X509Certificate2 zwraca RSACng wystąpienie. To zastosowanie RSACng jest szczegółem implementacji i podlega zmianie.
- Metoda GetRSAPrivateKey rozszerzenia dla X509Certificate2 obecnie preferuje RSACng wystąpienie, ale jeśli RSACng nie można otworzyć klucza, RSACryptoServiceProvider zostanie podjęta próba. Preferowany dostawca jest szczegółem implementacji i może ulec zmianie.
Natywna międzyoperacyjna usługa RSA
Platforma .NET uwidacznia typy, aby umożliwić programom współdziałanie z bibliotekami systemu operacyjnego używanymi przez kod kryptografii platformy .NET. Używane typy nie tłumaczą się między platformami i powinny być używane bezpośrednio tylko w razie potrzeby.
Typ | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
RSACryptoServiceProvider | ✔️ | ⚠✔1 | ⚠✔1 | ⚠✔1 | ⚠✔1 |
RSACng | ✔️ | ❌ | ❌ | ❌ | ❌ |
RSAOpenSsl | ❌ | ✔️ | ⚠✔2 | ❌ | ❌ |
1 W systemach innych niż Windows RSACryptoServiceProvider można użyć do zapewnienia zgodności z istniejącymi programami. W takim przypadku każda metoda, która wymaga międzyoperacyjności systemu operacyjnego, taka jak otwarcie nazwanego klucza, zgłasza wyjątek PlatformNotSupportedException.
2 W systemie macOS działa, RSAOpenSsl jeśli jest zainstalowany program OpenSSL, a odpowiedni biblioteki libcrypto dylib można znaleźć za pośrednictwem ładowania biblioteki dynamicznej. Jeśli nie można odnaleźć odpowiedniej biblioteki, wyjątki zostaną zgłoszone.
ECDSA
Generowanie kluczy ECDSA (Elliptic Curve Digital Signature Algorithm) odbywa się przez biblioteki systemu operacyjnego i podlega ograniczeniom rozmiaru i charakterystykom wydajności.
Krzywe kluczy ECDSA są definiowane przez biblioteki systemu operacyjnego i podlegają ich ograniczeniom.
Krzywa eliptyczna | Windows 10 | Windows 7 — 8.1 | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|---|
NIST P-256 (secp256r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
NIST P-384 (secp384r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
NIST P-521 (secp521r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Krzywe puli mózgów (nazywane krzywymi) | ✔️ | ❌ | ⚠✔1 | ❌ | ❌ | ⚠✔4 |
Inne nazwane krzywe | ⚠✔2 | ❌ | ⚠✔1 | ❌ | ❌ | ⚠✔4 |
Krzywe jawne | ✔️ | ❌ | ✔️ | ❌ | ❌ | ✔️ |
Eksportowanie lub importowanie jako jawne | ✔️ | ❌3 | ✔️ | ❌3 | ❌3 | ✔️ |
1 Dystrybucje systemu Linux nie mają obsługi tych samych nazwanych krzywych.
2 Obsługa nazwanych krzywych została dodana do systemu Windows CNG w systemie Windows 10. Aby uzyskać więcej informacji, zobacz CNG Named Elliptic Curves (Krzywe eliptyczne o nazwie CNG). Nazwane krzywe nie są dostępne we wcześniejszych wersjach systemu Windows, z wyjątkiem trzech krzywych w systemie Windows 7.
3 Eksportowanie z jawnymi parametrami krzywej wymaga obsługi biblioteki systemu operacyjnego, która nie jest dostępna na platformach Firmy Apple lub wcześniejszych wersjach systemu Windows.
4 Obsługa systemu Android dla niektórych krzywych zależy od wersji systemu Android. Dystrybutory systemu Android mogą również dodawać lub usuwać krzywe z kompilacji systemu Android.
Natywna międzyoperacyjna usługa ECDSA
Platforma .NET uwidacznia typy, aby umożliwić programom współdziałanie z bibliotekami systemu operacyjnego używanymi przez kod kryptografii platformy .NET. Używane typy nie tłumaczą się między platformami i powinny być używane bezpośrednio tylko w razie potrzeby.
Typ | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
ECDsaCng | ✔️ | ❌ | ❌ | ❌ | ❌ |
ECDsaOpenSsl | ❌ | ✔️ | ⚠️* | ❌ | ❌ |
* W systemie macOS działa, ECDsaOpenSsl jeśli biblioteka OpenSSL jest zainstalowana w systemie, a odpowiedni biblioteki libcrypto dylib można znaleźć za pośrednictwem ładowania biblioteki dynamicznej. Jeśli nie można odnaleźć odpowiedniej biblioteki, wyjątki zostaną zgłoszone.
ECDH
Generowanie klucza ECDH (Elliptic Curve Diffie-Hellman) odbywa się przez biblioteki systemu operacyjnego i podlega ograniczeniom rozmiaru i cechom wydajności.
Klasa ECDiffieHellman obsługuje "nieprzetworzone" wartość obliczeń ECDH, a także za pomocą następujących kluczowych funkcji wyprowadzania:
- HasH(Z)
- Skrót skrótu (z góry || Z || dołącz)
- HMAC(klucz, Z)
- HMAC(klucz, prepend || Z || dołącz)
- HMAC(Z, Z)
- HMAC(Z, prepend || Z || dołącz)
- Tls11Prf(label, seed)
Krzywe kluczy ECDH są definiowane przez biblioteki systemu operacyjnego i podlegają ich ograniczeniom.
Krzywa eliptyczna | Windows 10 | Windows 7 — 8.1 | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|---|
NIST P-256 (secp256r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
NIST P-384 (secp384r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
NIST P-521 (secp521r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Krzywe puli mózgów (nazywane krzywymi) | ✔️ | ❌ | ⚠✔1 | ❌ | ❌ | ⚠✔4 |
Inne nazwane krzywe | ⚠✔2 | ❌ | ⚠✔1 | ❌ | ❌ | ⚠✔4 |
Krzywe jawne | ✔️ | ❌ | ✔️ | ❌ | ❌ | ✔️ |
Eksportowanie lub importowanie jako jawne | ✔️ | ❌3 | ✔️ | ❌3 | ❌3 | ✔️ |
1 Dystrybucje systemu Linux nie mają obsługi tych samych nazwanych krzywych.
2 Obsługa nazwanych krzywych została dodana do systemu Windows CNG w systemie Windows 10. Aby uzyskać więcej informacji, zobacz CNG Named Elliptic Curves (Krzywe eliptyczne o nazwie CNG). Nazwane krzywe nie są dostępne we wcześniejszych wersjach systemu Windows, z wyjątkiem trzech krzywych w systemie Windows 7.
3 Eksportowanie z jawnymi parametrami krzywej wymaga obsługi biblioteki systemu operacyjnego, która nie jest dostępna na platformach Firmy Apple lub wcześniejszych wersjach systemu Windows.
4 Obsługa systemu Android dla niektórych krzywych zależy od wersji systemu Android. Dystrybutory systemu Android mogą również dodawać lub usuwać krzywe z kompilacji systemu Android.
Natywna międzyoperacyjna usługa ECDH
Platforma .NET uwidacznia typy, aby umożliwić programom współdziałanie z bibliotekami systemu operacyjnego używanymi przez platformę .NET. Używane typy nie tłumaczą się między platformami i powinny być używane bezpośrednio tylko w razie potrzeby.
Typ | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
ECDiffieHellmanCng | ✔️ | ❌ | ❌ | ❌ | ❌ |
ECDiffieHellmanOpenSsl | ❌ | ✔️ | ⚠️* | ❌ | ❌ |
* W systemie macOS działa, ECDiffieHellmanOpenSsl jeśli jest zainstalowany program OpenSSL, a odpowiedni biblioteki libcrypto dylib można znaleźć za pośrednictwem ładowania biblioteki dynamicznej. Jeśli nie można odnaleźć odpowiedniej biblioteki, wyjątki zostaną zgłoszone.
DSA
Generowanie kluczy DSA (algorytm podpisu cyfrowego) odbywa się przez biblioteki systemowe i podlega ograniczeniom rozmiaru i charakterystykom wydajności.
Function | Windows CNG | Linux | macOS | Windows CAPI | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|---|
Tworzenie klucza (<= 1024 bity) | ✔️ | ✔️ | ❌ | ✔️ | ❌ | ✔️ |
Tworzenie klucza (> 1024 bity) | ✔️ | ✔️ | ❌ | ❌ | ❌ | ✔️ |
Ładowanie kluczy (<= 1024 bitów) | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
Ładowanie kluczy (> 1024 bity) | ✔️ | ✔️ | ⚠️* | ❌ | ❌ | ✔️ |
FIPS 186-2 | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
FIPS 186-3 (podpisy SHA-2) | ✔️ | ✔️ | ❌ | ❌ | ❌ | ✔️ |
* System macOS ładuje klucze DSA większe niż 1024 bity, ale zachowanie tych kluczy jest niezdefiniowane. Nie zachowują się zgodnie z FIPS 186-3.
DsA w systemie Windows
- Interfejs WINDOWS CryptoAPI (CAPI) jest używany zawsze, gdy
new DSACryptoServiceProvider()
jest używany. - Interfejs API kryptografii systemu Windows nowej generacji (CNG) jest używany za każdym razem, gdy
new DSACng()
jest używany. - Obiekt zwracany przez DSA.Create program jest wewnętrznie obsługiwany przez CNG systemu Windows. To użycie CNG systemu Windows jest szczegółem implementacji i może ulec zmianie.
- GetDSAPublicKey Metoda rozszerzenia dla X509Certificate2 zwraca DSACng wystąpienie. To zastosowanie DSACng jest szczegółem implementacji i podlega zmianie.
- Metoda GetDSAPrivateKey rozszerzenia preferuje X509Certificate2 DSACng wystąpienie, ale jeśli DSACng nie można otworzyć klucza, DSACryptoServiceProvider zostanie podjęta próba. Preferowany dostawca jest szczegółem implementacji i może ulec zmianie.
Natywna międzyoperacyjna usługa DSA
Platforma .NET uwidacznia typy, aby umożliwić programom współdziałanie z bibliotekami systemu operacyjnego używanymi przez kod kryptografii platformy .NET. Używane typy nie tłumaczą się między platformami i powinny być używane bezpośrednio tylko w razie potrzeby.
Typ | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
DSACryptoServiceProvider | ✔️ | ⚠✔1 | ⚠✔1 | ❌ | ⚠✔1 |
DSACng | ✔️ | ❌ | ❌ | ❌ | ❌ |
DSAOpenSsl | ❌ | ✔️ | ⚠✔2 | ❌ | ❌ |
1 W systemach innych niż Windows DSACryptoServiceProvider można użyć do zapewnienia zgodności z istniejącymi programami. W takim przypadku każda metoda, która wymaga międzyoperacyjności systemu, takiej jak otwarcie nazwanego klucza, zgłasza wyjątek PlatformNotSupportedException.
2 W systemie macOS działa, DSAOpenSsl jeśli jest zainstalowany program OpenSSL, a odpowiedni biblioteki libcrypto dylib można znaleźć za pośrednictwem ładowania biblioteki dynamicznej. Jeśli nie można odnaleźć odpowiedniej biblioteki, wyjątki zostaną zgłoszone.
Certyfikaty X.509
Większość obsługi certyfikatów X.509 na platformie .NET pochodzi z bibliotek systemu operacyjnego. Aby załadować certyfikat do X509Certificate2 wystąpienia lub X509Certificate na platformie .NET, certyfikat musi zostać załadowany przez podstawową bibliotekę systemu operacyjnego.
Odczytywanie PKCS12/PFX
Scenariusz | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Pusty | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Jeden certyfikat, bez klucza prywatnego | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Jeden certyfikat z kluczem prywatnym | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Wiele certyfikatów, bez kluczy prywatnych | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Wiele certyfikatów, jeden klucz prywatny | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Wiele certyfikatów, wiele kluczy prywatnych | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Zapisywanie PKCS12/PFX
Scenariusz | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Pusty | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Jeden certyfikat, bez klucza prywatnego | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Jeden certyfikat z kluczem prywatnym | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Wiele certyfikatów, bez kluczy prywatnych | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Wiele certyfikatów, jeden klucz prywatny | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Wiele certyfikatów, wiele kluczy prywatnych | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Ładowanie efemeryczne | ✔️ | ✔️ | ❌ | ✔️ | ✔️ |
System macOS nie może załadować kluczy prywatnych certyfikatu bez obiektu pęku kluczy, który wymaga zapisu na dysku. Pęki kluczy są tworzone automatycznie na potrzeby ładowania PFX i są usuwane, gdy nie są już używane. X509KeyStorageFlags.EphemeralKeySet Ponieważ opcja oznacza, że klucz prywatny nie powinien być zapisywany na dysku, twierdząc, że flaga w systemie macOS powoduje wyświetlenie elementu PlatformNotSupportedException.
Pisanie kolekcji certyfikatów PKCS7
Zarówno systemy Windows, jak i Linux emitują obiekty blob zakodowane w formacie DER PKCS7. System macOS emituje obiekty blob PKCS7 zakodowane na czas nieokreślony.
X509Store
W systemie Windows X509Store klasa jest reprezentacją interfejsów API magazynu certyfikatów systemu Windows. Te interfejsy API działają tak samo w programach .NET Core i .NET 5, jak w programie .NET Framework.
W systemach innych niż Windows X509Store klasa jest projekcją decyzji dotyczących zaufania systemu (tylko do odczytu), decyzji dotyczących zaufania użytkowników (odczytu i zapisu) oraz magazynu kluczy użytkownika (odczyt-zapis).
W poniższych tabelach pokazano, które scenariusze są obsługiwane na każdej platformie. W przypadku nieobsługiwanych scenariuszy (❌ w tabelach) CryptographicException zgłaszany jest wyjątek .
Mój sklep
Scenariusz | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Otwórz plik CurrentUser\My (ReadOnly) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Otwórz plik CurrentUser\My (ReadWrite) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Otwórz plik CurrentUser\My (IstniejącyOnly) | ✔️ | ⚠️ | ✔️ | ✔️ | ✔️ |
Otwórz plik LocalMachine\My | ✔️ | ❌ | ✔️ | ✔️ | ✔️ |
W systemie Linux sklepy są tworzone przy pierwszym zapisie i domyślnie nie istnieją żadne magazyny użytkowników, więc otwieranie CurrentUser\My
za pomocą polecenia może zakończyć się niepowodzeniem ExistingOnly
.
W systemie macOS CurrentUser\My
magazyn jest domyślnym pękiem kluczy użytkownika, który jest login.keychain
domyślnie. Sklep LocalMachine\My
ma wartość System.keychain
.
Magazyn główny
Scenariusz | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Otwórz plik CurrentUser\Root (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
Otwórz plik CurrentUser\Root (ReadWrite) | ✔️ | ✔️ | ❌ | ❌ | ❌ |
Otwórz plik CurrentUser\Root (IstniejącyOnly) | ✔️ | ⚠️ | ✔️ (jeśli readonly) | ❌ | ✔️ (jeśli readonly) |
Otwórz plik LocalMachine\Root (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
Otwórz plik LocalMachine\Root (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
Otwórz plik LocalMachine\Root (IstniejącyOnly) | ✔️ | ⚠️ | ✔️ (jeśli readonly) | ❌ | ✔️ (jeśli readonly) |
W systemie Linux LocalMachine\Root
magazyn jest interpretacją pakietu urzędu certyfikacji w domyślnej ścieżce dla biblioteki OpenSSL.
W systemie macOS CurrentUser\Root
magazyn jest interpretacją SecTrustSettings
wyników dla domeny zaufania użytkownika. Magazyn LocalMachine\Root
jest interpretacją SecTrustSettings
wyników dla domen zaufania administratora i systemu.
Magazyn pośredni
Scenariusz | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Otwórz plik CurrentUser\Intermediate (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ❌ |
Otwórz plik CurrentUser\Intermediate (ReadWrite) | ✔️ | ✔️ | ❌ | ❌ | ❌ |
Otwórz plik CurrentUser\Intermediate (IstniejącyOnly) | ✔️ | ⚠️ | ✔️ (jeśli readonly) | ❌ | ❌ |
Otwórz plik LocalMachine\Intermediate (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ❌ |
Otwórz plik LocalMachine\Intermediate (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
Otwórz plik LocalMachine\Intermediate (IstniejącyOnly) | ✔️ | ⚠️ | ✔️ (jeśli readonly) | ❌ | ❌ |
W systemie Linux CurrentUser\Intermediate
magazyn jest używany jako pamięć podręczna podczas pobierania pośrednich urzędów certyfikacji przez rekordy dostępu do informacji o urzędzie na pomyślnych kompilacjach X509Chain. Magazyn LocalMachine\Intermediate
jest interpretacją pakietu urzędu certyfikacji w domyślnej ścieżce dla biblioteki OpenSSL.
W systemie macOS CurrentUser\Intermediate
magazyn jest traktowany jako magazyn niestandardowy. Certyfikaty dodane do tego magazynu nie mają wpływu na tworzenie łańcucha X.509.
Niedozwolony sklep
Scenariusz | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Otwórz plik CurrentUser\Disallowed (ReadOnly) | ✔️ | ⚠️ | ✔️ | ✔️ | ✔️ |
Otwórz plik CurrentUser\Disallowed (ReadWrite) | ✔️ | ⚠️ | ❌ | ❌ | ❌ |
Otwórz plik CurrentUser\Disallowed (ExistingOnly) | ✔️ | ⚠️ | ✔️ (jeśli readonly) | ✔️ (jeśli readonly) | ✔️ (jeśli readonly) |
Otwórz plik LocalMachine\Disallowed (ReadOnly) | ✔️ | ❌ | ✔️ | ✔️ | ✔️ |
Otwórz plik LocalMachine\Disallowed (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
Otwórz plik LocalMachine\Disallowed (ExistingOnly) | ✔️ | ❌ | ✔️ (jeśli readonly) | ✔️ (jeśli readonly) | ✔️ (jeśli readonly) |
W systemie Linux magazyn nie jest używany w tworzeniu Disallowed
łańcucha i próbuje dodać do niego zawartość, co powoduje wyświetlenie elementu CryptographicException. Element CryptographicException jest zgłaszany podczas otwierania sklepu Disallowed
, jeśli już nabył zawartość.
W systemie macOS, CurrentUser\Disallowed i LocalMachine\Disallowed stores to interpretacje odpowiednich wyników SecTrustSettings dla certyfikatów, których zaufanie jest ustawione na Always Deny
.
Brak magazynu
Scenariusz | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Otwórz magazyn nieistniejący (ExistingOnly) | ❌ | ❌ | ❌ | ❌ | ❌ |
Otwórz magazyn bieżącyUżytkownika, który nie istnieje (ReadWrite) | ✔️ | ✔️ | ⚠️ | ❌ | ❌ |
Otwórz magazyn LocalMachine nieistniejący (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
W systemie macOS tworzenie magazynu niestandardowego przy użyciu interfejsu API X509Store jest obsługiwane tylko w przypadku CurrentUser
lokalizacji. Spowoduje to utworzenie nowego łańcucha kluczy bez hasła w katalogu łańcucha kluczy użytkownika (~/Library/Keychains). Aby utworzyć pęk kluczy z hasłem, można użyć P/Invoke SecKeychainCreate
. SecKeychainOpen
Podobnie można użyć do otwierania pęków kluczy w różnych lokalizacjach. Wynikowy IntPtr
może zostać przekazany w celu new X509Store(IntPtr)
uzyskania magazynu z obsługą odczytu/zapisu, z zastrzeżeniem uprawnień bieżącego użytkownika.
X509Chain
System macOS nie obsługuje użycia listy CRL w trybie offline, dlatego X509RevocationMode.Offline
jest traktowany jako X509RevocationMode.Online
.
System macOS nie obsługuje limitu czasu inicjowanego przez użytkownika na liście CRL (lista odwołania certyfikatów) / OCSP (protokół stanu certyfikatu online) / pobieranie AIA (dostęp do informacji o urzędzie), więc X509ChainPolicy.UrlRetrievalTimeout
jest ignorowane.