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 skrótu

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, są implementowane przy użyciu kodu zarządzanego.

SHA-3

Platforma .NET 8 wprowadziła obsługę algorytmów wyznaczania wartości skrótu SHA-3, w tym SHAKE-128 i SHAKE-256. Obsługa algorytmu SHA-3 jest obecnie obsługiwana w systemie Windows 11 w wersji 25324 lub nowszej, a system Linux z programem OpenSSL 1.1.1 lub nowszym.

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.dylibi libcrypto.42.dylib pochodzą z bibliotek LibreSSL i nie będą używane.

AES-GCM i ChaCha20Poly1305 w systemie macOS

System macOS nie obsługiwał usługi AES-GCM ani ChaCha20Poly1305 do systemu macOS 10.15 dla kodu innej firmy. Przed platformą .NET 8 AesGcm i ChaCha20Poly1305 mają takie same wymagania jak program AES-CCM, a użytkownicy muszą zainstalować bibliotekę OpenSSL, aby te typy działały.

Począwszy od platformy .NET 8, platforma .NET w systemie macOS będzie używać platformy CryptoKit firmy Apple dla usług AES-GCM i ChaCha20Poly1305. Użytkownicy nie będą musieli instalować ani konfigurować żadnych dodatkowych zależności dla usług AES-GCM ani ChaCha20Poly1305 w systemie macOS.

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). W systemie macOS rozmiar tagu jest ograniczony do 128-bitowego (16-bajtowego) 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-32 Windows 11 Build 25324+ OpenSSL 1.1.1+
Podpis PKCS1 (MD5, SHA-1) ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Podpis PKCS1 (SHA-2) ✔️ ✔️ ✔️ ✔️ ✔️ ⚠✔1
Podpis PKCS1 (SHA-3)2 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.

2 wymaga platformy .NET 8.

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)

Wyprowadzanie klucza "Raw" zostało wprowadzone na platformie .NET 8.

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 X509Certificate2DSACng 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 magazyny CurrentUser\Disallowed i LocalMachine\Disallowed są interpretacjami odpowiednich wyników SecTrust Ustawienia dla certyfikatów, których zaufanie ma ustawioną wartość 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.

Dodatkowe zasoby