Plattformsoberoende kryptografi i .NET
Kryptografiska åtgärder i .NET utförs av operativsystembibliotek (OS). Det här beroendet har fördelar:
- .NET-appar drar nytta av tillförlitligheten i operativsystemet. Att skydda kryptografibibliotek från sårbarheter är en hög prioritet för OS-leverantörer. För att göra det tillhandahåller de uppdateringar som systemadministratörer bör tillämpa.
- .NET-appar har åtkomst till FIPS-verifierade algoritmer om OS-biblioteken är FIPS-verifierade.
Beroendet av OS-bibliotek innebär också att .NET-appar endast kan använda kryptografiska funktioner som operativsystemet stöder. Även om alla plattformar stöder vissa kärnfunktioner kan vissa funktioner som .NET stöder inte användas på vissa plattformar. Den här artikeln identifierar de funktioner som stöds på varje plattform.
Den här artikeln förutsätter att du har en fungerande kunskap om kryptografi i .NET. Mer information finns i .NET Cryptography Model och .NET Cryptographic Services.
Algoritmer för hash- och meddelandeautentisering
Alla hash-algoritmer och hash-baserade HMAC-klasser (meddelandeautentisering), inklusive klasserna *Managed
, skjuts upp till OS-biblioteken med undantag för .NET i webbläsarens WASM. I webbläsarens WASM, SHA-1, SHA-2-256, SHA-2-384, SHA-2-512 och HMAC-motsvarigheter implementeras med hjälp av hanterad kod.
Algoritm | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android | Webbläsare |
---|---|---|---|---|---|---|
MD5 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
SHA-1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
SHA-2-256 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
SHA-2-384 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
SHA-2-512 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
SHA-3-2561 | Windows 11 Build 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
SHA-3-3841 | Windows 11 Build 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
SHA-3-5121 | Windows 11 Build 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
SHAKE-1281 | Windows 11 Build 25324+ | OpenSSL 1.1.1+3 | ❌ | ❌ | ❌ | ❌ |
SHAKE-2561 | Windows 11 Build 25324+ | OpenSSL 1.1.1+3 | ❌ | ❌ | ❌ | ❌ |
HMAC-MD5 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
HMAC-SHA-1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
HMAC-SHA-2-256 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
HMAC-SHA-2-384 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
HMAC-SHA-2-512 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
HMAC-SHA-3-2561 | Windows 11 Build 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
HMAC-SHA-3-3841 | Windows 11 Build 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
HMAC-SHA-3-5121 | Windows 11 Build 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
KMAC-1282 | Windows 11 Build 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
KMAC-2562 | Windows 11 Build 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
KMAC-XOF-1282 | Windows 11 Build 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
KMAC-XOF-2562 | Windows 11 Build 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
1Tillgängligt från och med .NET 8.
2Tillgängligt från och med .NET 9.
3Utökningsbar utdatafunktion för direktuppspelning (XOF) är tillgänglig från och med .NET 9. I Linux kräver detta OpenSSL 3.3.
Symmetrisk kryptering
De underliggande chiffer och kedjekopplingar görs av systembiblioteken.
Chiffer + läge | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
AES-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
AES-ECB | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
AES-CFB8 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
AES-CFB128 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
3DES-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
3DES-ECB | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
3DES-CFB8 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
3DES-CFB64 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
DES-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
DES-ECB | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
DES-CFB8 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
RC2-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
RC2-ECB | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
RC2-CFB | ❌ | ❌ | ❌ | ❌ | ❌ |
Autentiserad kryptering
Stöd för autentiserad System.Security.Cryptography.AesCcmkryptering (AE) tillhandahålls för AES-CCM, AES-GCM och ChaCha20Poly1305 via klasserna , System.Security.Cryptography.AesGcmrespektive System.Security.Cryptography.ChaCha20Poly1305 .
Eftersom autentiserad kryptering kräver nyare plattforms-API:er för att stödja algoritmen kanske stödet inte finns på alla plattformar. Den IsSupported
statiska egenskapen för klasserna för algoritmen kan användas för att identifiera vid körning om den aktuella plattformen stöder algoritmen eller inte.
Chiffer + läge | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android | Webbläsare |
---|---|---|---|---|---|---|
AES-GCM | ✔️ | ✔️ | ⚠️ | ⚠️ | ✔️ | ❌ |
AES-CCM | ✔️ | ✔️ | ⚠️ | ❌ | ✔️ | ❌ |
ChaCha20Poly1305 | Windows 10 Build 20142+ | OpenSSL 1.1.0+ | ⚠️ | ⚠️ | API-nivå 28+ | ❌ |
AES-CCM på macOS
På macOS stöder systembiblioteken inte AES-CCM för kod från tredje part, så AesCcm klassen använder OpenSSL som stöd. Användare på macOS måste hämta en lämplig kopia av OpenSSL (libcrypto) för att den här typen ska fungera, och den måste finnas i en sökväg som systemet skulle läsa in ett bibliotek från som standard. Vi rekommenderar att du installerar OpenSSL från en pakethanterare, till exempel Homebrew.
Biblioteken libcrypto.0.9.7.dylib
och libcrypto.0.9.8.dylib
som ingår i macOS kommer från tidigare versioner av OpenSSL och kommer inte att användas. Biblioteken libcrypto.35.dylib
, libcrypto.41.dylib
och libcrypto.42.dylib
kommer från LibreSSL och kommer inte att användas.
AES-GCM och ChaCha20Poly1305 på macOS
macOS stödde inte AES-GCM eller ChaCha20Poly1305 förrän macOS 10.15 för kod från tredje part. Före .NET 8 AesGcm och ChaCha20Poly1305 har samma krav som AES-CCM och användarna måste installera OpenSSL för att dessa typer ska fungera.
Från och med .NET 8 använder .NET på macOS Apples CryptoKit-ramverk för AES-GCM och ChaCha20Poly1305. Användarna behöver inte installera eller konfigurera ytterligare beroenden för AES-GCM eller ChaCha20Poly1305 på macOS.
AES-GCM och ChaCha20Poly1305 på iOS, tvOS och MacCatalyst
Stöd för AES-GCM och ChaCha20Poly1305 är tillgängligt från och med .NET 9 på iOS och tvOS 13.0 och senare samt alla versioner av MacCatalyst.
AES-CCM-nycklar, nonces och taggar
Nyckelstorlekar
AES-CCM fungerar med 128, 192 och 256-bitars nycklar.
Nonce-storlekar
Klassen AesCcm stöder nonces för 56, 64, 72, 80, 88, 96 och 104 bitar (7, 8, 9, 10, 11, 12 och 13 byte).
Taggstorlekar
Klassen AesCcm stöder skapande eller bearbetning av taggarna 32, 48, 64, 80, 96, 112 och 128 bitar (4, 8, 10, 12, 14 och 16 byte).
AES-GCM-nycklar, nonces och taggar
Nyckelstorlekar
AES-GCM fungerar med 128, 192 och 256-bitars nycklar.
Nonce-storlekar
Klassen AesGcm stöder endast 96-bitars nonces (12 byte).
Taggstorlekar I Windows och Linux AesGcm har klassen stöd för att skapa eller bearbeta taggarna 96, 104, 112, 120 och 128 bitar (12, 13, 14, 15 och 16 byte). På Apple-plattformar är taggstorleken begränsad till 128-bitars (16 byte) på grund av begränsningar i CryptoKit-ramverket.
ChaCha20Poly1305-nycklar, nonces och taggar.
ChaCha20Poly1305 har en fast storlek för nyckel-, nonce- och autentiseringstaggen. ChaCha20Poly1305 använder alltid en 256-bitarsnyckel, en 96-bitars (12 byte) nonce och en 128-bitars tagg (16 byte).
Asymmetrisk kryptografi
Det här avsnittet innehåller följande underavsnitt:
RSA
RSA-nyckelgenereringen (Rivest–Shamir–Adleman) utförs av OS-biblioteken och omfattas av deras storleksbegränsningar och prestandaegenskaper.
RSA-nyckelåtgärder utförs av OS-biblioteken och de typer av nycklar som kan läsas in omfattas av OS-kraven.
.NET exponerar inte RSA-åtgärder (oskyddade) "raw".
Stöd för utfyllnad och sammandrag varierar beroende på plattform:
Utfyllnadsläge | Windows (CNG) | Linux (OpenSSL) | macOS | iOS, tvOS, MacCatalyst | Android | Windows (CAPI) |
---|---|---|---|---|---|---|
PKCS1-kryptering | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
OAEP - SHA-1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
OAEP - SHA-2 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
OAEP - SHA-32 | Windows 11 Build 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
PKCS1-signatur (MD5, SHA-1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
PKCS1-signatur (SHA-2) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ⚠️1 |
PKCS1-signatur (SHA-3)2 | Windows 11 Build 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
PSS | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
1 Windows CryptoAPI (CAPI) kan använda PKCS1-signatur med en SHA-2-algoritm. Men det enskilda RSA-objektet kan läsas in i en kryptografisk tjänstprovider (CSP) som inte stöder det.
2 Kräver .NET 8.
RSA i Windows
- Windows CryptoAPI (CAPI) används när det
new RSACryptoServiceProvider()
används. - Windows Cryptography API Next Generation (CNG) används när det
new RSACng()
används. - Objektet som returneras av RSA.Create drivs internt av Windows CNG. Den här användningen av Windows CNG är en implementeringsinformation och kan komma att ändras.
- Tilläggsmetoden GetRSAPublicKey för X509Certificate2 returnerar en RSACng instans. Den här användningen av RSACng är en implementeringsinformation och kan komma att ändras.
- Tilläggsmetoden GetRSAPrivateKey för föredrar för X509Certificate2 närvarande en RSACng instans, men om RSACng det inte går att öppna nyckeln RSACryptoServiceProvider görs ett försök. Den föredragna providern är en implementeringsinformation och kan komma att ändras.
RSA-inbyggt interop
.NET exponerar typer för att tillåta att program samverkar med de OS-bibliotek som .NET-kryptografikoden använder. De typer som berörs översätter inte mellan plattformar och bör endast användas direkt när det behövs.
Typ | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
RSACryptoServiceProvider | ✔️ | ⚠️1 | ⚠️1 | ⚠️1 | ⚠️1 |
RSACng | ✔️ | ❌ | ❌ | ❌ | ❌ |
RSAOpenSsl | ❌ | ✔️ | ⚠️2 | ❌ | ❌ |
1 På icke-Windows RSACryptoServiceProvider kan användas för kompatibilitet med befintliga program. I så fall genererar alla metoder som kräver OS-interop, till exempel att öppna en namngiven nyckel, en PlatformNotSupportedException.
2 På macOS fungerar RSAOpenSsl om OpenSSL är installerat och en lämplig libcrypto dylib kan hittas via dynamisk inläsning av bibliotek. Om det inte går att hitta ett lämpligt bibliotek genereras undantag.
ECDSA
ECDSA-nyckelgenereringen (Elliptic Curve Digital Signature Algorithm) utförs av OS-biblioteken och omfattas av deras storleksbegränsningar och prestandaegenskaper.
ECDSA-nyckelkurvor definieras av OS-biblioteken och omfattas av deras begränsningar.
Elliptisk kurva | Windows 10 | Windows 7 – 8.1 | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|---|
NIST P-256 (sekp256r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
NIST P-384 (sekp384r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
NIST P-521 (sekp521r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Brainpool-kurvor (som namngivna kurvor) | ✔️ | ❌ | ⚠️1 | ❌ | ❌ | ⚠️4 |
Andra namngivna kurvor | ⚠️2 | ❌ | ⚠️1 | ❌ | ❌ | ⚠️4 |
Explicita kurvor | ✔️ | ❌ | ✔️ | ❌ | ❌ | ✔️ |
Exportera eller importera som explicit | ✔️ | ❌3 | ✔️ | ❌3 | ❌3 | ✔️ |
1 Linux-distributioner har inte stöd för samma namngivna kurvor.
2 Stöd för namngivna kurvor har lagts till i Windows CNG i Windows 10. Mer information finns i CNG Med namnet Elliptiska kurvor. Namngivna kurvor är inte tillgängliga i tidigare versioner av Windows, förutom tre kurvor i Windows 7.
3 Export med explicita kurvparametrar kräver stöd för OS-bibliotek, som inte är tillgängligt på Apple-plattformar eller tidigare versioner av Windows.
4 Android-stöd för vissa kurvor beror på Android-versionen. Android-distributörer kan också välja att lägga till eller ta bort kurvor från sin Android-version.
ECDSA Native Interop
.NET exponerar typer för att tillåta att program samverkar med de OS-bibliotek som .NET-kryptografikoden använder. De typer som berörs översätter inte mellan plattformar och bör endast användas direkt när det behövs.
Typ | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
ECDsaCng | ✔️ | ❌ | ❌ | ❌ | ❌ |
ECDsaOpenSsl | ❌ | ✔️ | ⚠️* | ❌ | ❌ |
* På macOS fungerar ECDsaOpenSsl om OpenSSL är installerat i systemet och en lämplig libcrypto dylib kan hittas via dynamisk biblioteksinläsning. Om det inte går att hitta ett lämpligt bibliotek genereras undantag.
ECDH
ECDH-nyckelgenereringen (Elliptic Curve Diffie-Hellman) utförs av OS-biblioteken och omfattas av deras storleksbegränsningar och prestandaegenskaper.
Klassen ECDiffieHellman stöder det "råa" värdet för ECDH-beräkningen samt genom följande viktiga härledningsfunktioner:
- HASH(Z)
- HASH(prepend || Z || tillägg)
- HMAC(nyckel, Z)
- HMAC(key, prepend || Z || tillägg)
- HMAC(Z, Z)
- HMAC(Z, prepend || Z || tillägg)
- Tls11Prf(etikett, frö)
"Raw"-nyckelhärledning introducerades i .NET 8.
ECDH-nyckelkurvor definieras av OS-biblioteken och omfattas av deras begränsningar.
Elliptisk kurva | Windows 10 | Windows 7 – 8.1 | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|---|
NIST P-256 (sekp256r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
NIST P-384 (sekp384r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
NIST P-521 (sekp521r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Brainpool-kurvor (som namngivna kurvor) | ✔️ | ❌ | ⚠️1 | ❌ | ❌ | ⚠️4 |
Andra namngivna kurvor | ⚠️2 | ❌ | ⚠️1 | ❌ | ❌ | ⚠️4 |
Explicita kurvor | ✔️ | ❌ | ✔️ | ❌ | ❌ | ✔️ |
Exportera eller importera som explicit | ✔️ | ❌3 | ✔️ | ❌3 | ❌3 | ✔️ |
1 Linux-distributioner har inte stöd för samma namngivna kurvor.
2 Stöd för namngivna kurvor har lagts till i Windows CNG i Windows 10. Mer information finns i CNG Med namnet Elliptiska kurvor. Namngivna kurvor är inte tillgängliga i tidigare versioner av Windows, förutom tre kurvor i Windows 7.
3 Export med explicita kurvparametrar kräver stöd för OS-bibliotek, som inte är tillgängligt på Apple-plattformar eller tidigare versioner av Windows.
4 Android-stöd för vissa kurvor beror på Android-versionen. Android-distributörer kan också välja att lägga till eller ta bort kurvor från sin Android-version.
ECDH-inbyggt interop
.NET exponerar typer för att tillåta att program samverkar med de OS-bibliotek som .NET använder. De typer som berörs översätter inte mellan plattformar och bör endast användas direkt när det behövs.
Typ | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
ECDiffieHellmanCng | ✔️ | ❌ | ❌ | ❌ | ❌ |
ECDiffieHellmanOpenSsl | ❌ | ✔️ | ⚠️* | ❌ | ❌ |
* På macOS fungerar ECDiffieHellmanOpenSsl om OpenSSL är installerat och en lämplig libcrypto dylib kan hittas via dynamisk inläsning av bibliotek. Om det inte går att hitta ett lämpligt bibliotek genereras undantag.
DSA
DSA-nyckelgenereringen (digital signaturalgoritm) utförs av systembiblioteken och omfattas av deras storleksbegränsningar och prestandaegenskaper.
Funktion | Windows CNG | Linux | macOS | Windows CAPI | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|---|
Nyckelskapande (<= 1 024 bitar) | ✔️ | ✔️ | ❌ | ✔️ | ❌ | ✔️ |
Nyckelskapande (> 1 024 bitar) | ✔️ | ✔️ | ❌ | ❌ | ❌ | ✔️ |
Läser in nycklar (<= 1 024 bitar) | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
Läser in nycklar (> 1 024 bitar) | ✔️ | ✔️ | ⚠️* | ❌ | ❌ | ✔️ |
FIPS 186-2 | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
FIPS 186-3 (SHA-2-signaturer) | ✔️ | ✔️ | ❌ | ❌ | ❌ | ✔️ |
* macOS läser in DSA-nycklar som är större än 1 024 bitar, men beteendet för dessa nycklar är odefinierat. De beter sig inte enligt FIPS 186-3.
DSA i Windows
- Windows CryptoAPI (CAPI) används när det
new DSACryptoServiceProvider()
används. - Windows Cryptography API Next Generation (CNG) används när det
new DSACng()
används. - Objektet som returneras av DSA.Create drivs internt av Windows CNG. Den här användningen av Windows CNG är en implementeringsinformation och kan komma att ändras.
- Tilläggsmetoden GetDSAPublicKey för X509Certificate2 returnerar en DSACng instans. Den här användningen av DSACng är en implementeringsinformation och kan komma att ändras.
- Tilläggsmetoden GetDSAPrivateKey för X509Certificate2 föredrar en DSACng instans, men om DSACng det inte går att öppna nyckeln DSACryptoServiceProvider görs ett försök. Den föredragna providern är en implementeringsinformation och kan komma att ändras.
DSA-inbyggt interop
.NET exponerar typer för att tillåta att program samverkar med de OS-bibliotek som .NET-kryptografikoden använder. De typer som berörs översätter inte mellan plattformar och bör endast användas direkt när det behövs.
Typ | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
DSACryptoServiceProvider | ✔️ | ⚠️1 | ⚠️1 | ❌ | ⚠️1 |
DSACng | ✔️ | ❌ | ❌ | ❌ | ❌ |
DSAOpenSsl | ❌ | ✔️ | ⚠️2 | ❌ | ❌ |
1 På icke-Windows DSACryptoServiceProvider kan användas för kompatibilitet med befintliga program. I så fall genererar alla metoder som kräver systeminterop, till exempel att öppna en namngiven nyckel, en PlatformNotSupportedException.
2 På macOS fungerar DSAOpenSsl om OpenSSL är installerat och en lämplig libcrypto dylib kan hittas via dynamisk inläsning av bibliotek. Om det inte går att hitta ett lämpligt bibliotek genereras undantag.
X.509-certifikat
Merparten av stödet för X.509-certifikat i .NET kommer från OS-bibliotek. Om du vill läsa in ett certifikat till en X509Certificate2 instans i X509Certificate .NET måste certifikatet läsas in av det underliggande OS-biblioteket.
Läsa en PKCS12/PFX
Scenario | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Tomt | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Ett certifikat, ingen privat nyckel | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Ett certifikat med privat nyckel | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Flera certifikat, inga privata nycklar | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Flera certifikat, en privat nyckel | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Flera certifikat, flera privata nycklar | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Skriva en PKCS12/PFX
Scenario | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Tomt | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Ett certifikat, ingen privat nyckel | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Ett certifikat med privat nyckel | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Flera certifikat, inga privata nycklar | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Flera certifikat, en privat nyckel | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Flera certifikat, flera privata nycklar | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Tillfällig inläsning | ✔️ | ✔️ | ❌ | ✔️ | ✔️ |
macOS kan inte läsa in privata certifikatnycklar utan ett nyckelringsobjekt, vilket kräver att du skriver till disken. Nyckelringar skapas automatiskt för PFX-inläsning och tas bort när de inte längre används. Eftersom alternativet X509KeyStorageFlags.EphemeralKeySet innebär att den privata nyckeln inte ska skrivas till disken resulterar det i en PlatformNotSupportedException.
Skriva en PKCS7-certifikatsamling
Både Windows och Linux genererar DER-kodade PKCS7-blobar. macOS genererar obegränsade CER-kodade PKCS7-blobar.
X509Store
I Windows X509Store är klassen en representation av API:erna för Windows Certificate Store. Dessa API:er fungerar på samma sätt i .NET Core och .NET 5 som i .NET Framework.
I icke-Windows X509Store är klassen en projektion av beslut om systemförtroende (skrivskyddad), beslut om användarförtroende (läs-skrivning) och lagring av användarnycklar (läs-skriv).
Följande tabeller visar vilka scenarier som stöds på varje plattform. För scenarier som inte stöds (❌ i tabellerna) genereras en CryptographicException .
Min butik
Scenario | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Öppna CurrentUser\My (ReadOnly) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Öppna CurrentUser\My (ReadWrite) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Öppna CurrentUser\My (ExistingOnly) | ✔️ | ⚠️ | ✔️ | ✔️ | ✔️ |
Öppna LocalMachine\My | ✔️ | ❌ | ✔️ | ✔️ | ✔️ |
I Linux skapas butiker vid första skrivningen och det finns inga användarlager som standard, så det går inte att öppna CurrentUser\My
med ExistingOnly
.
På macOS är arkivet CurrentUser\My
användarens standardnyckelring, vilket är login.keychain
standard. Butiken LocalMachine\My
är System.keychain
.
Rotarkivet
Scenario | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Öppna CurrentUser\Root (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
Öppna CurrentUser\Root (ReadWrite) | ✔️ | ✔️ | ❌ | ❌ | ❌ |
Öppna CurrentUser\Root (ExistingOnly) | ✔️ | ⚠️ | ✔️ (om ReadOnly) | ❌ | ✔️ (om ReadOnly) |
Öppna LocalMachine\Root (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
Öppna LocalMachine\Root (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
Öppna LocalMachine\Root (ExistingOnly) | ✔️ | ⚠️ | ✔️ (om ReadOnly) | ❌ | ✔️ (om ReadOnly) |
I Linux LocalMachine\Root
är store en tolkning av CA-paketet i standardsökvägen för OpenSSL.
På macOS är arkivet CurrentUser\Root
en tolkning av SecTrustSettings
resultatet för domänen för användarförtroende. Arkivet LocalMachine\Root
är en tolkning av SecTrustSettings
resultaten för administratörs- och systemförtroendedomänerna.
Mellanlagringsplatsen
Scenario | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Öppna CurrentUser\Intermediate (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ❌ |
Öppna CurrentUser\Intermediate (ReadWrite) | ✔️ | ✔️ | ❌ | ❌ | ❌ |
Öppna CurrentUser\Intermediate (ExistingOnly) | ✔️ | ⚠️ | ✔️ (om ReadOnly) | ❌ | ❌ |
Öppna LocalMachine\Intermediate (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ❌ |
Öppna LocalMachine\Intermediate (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
Öppna LocalMachine\Intermediate (ExistingOnly) | ✔️ | ⚠️ | ✔️ (om ReadOnly) | ❌ | ❌ |
I Linux används arkivet CurrentUser\Intermediate
som en cache när mellanliggande certifikatutfärdare laddas ned av sina åtkomstposter för utfärdarinformation i lyckade X509Chain-versioner. Arkivet LocalMachine\Intermediate
är en tolkning av CA-paketet i standardsökvägen för OpenSSL.
På macOS CurrentUser\Intermediate
behandlas butiken som ett anpassat arkiv. Certifikat som läggs till i det här arkivet påverkar inte X.509-kedjebygget.
Det otillåtna arkivet
Scenario | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Öppna CurrentUser\Otillåten (ReadOnly) | ✔️ | ⚠️ | ✔️ | ✔️ | ✔️ |
Öppna CurrentUser\Otillåten (ReadWrite) | ✔️ | ⚠️ | ❌ | ❌ | ❌ |
Öppna CurrentUser\Otillåten (ExistingOnly) | ✔️ | ⚠️ | ✔️ (om ReadOnly) | ✔️ (om ReadOnly) | ✔️ (om ReadOnly) |
Öppna LocalMachine\Otillåten (ReadOnly) | ✔️ | ❌ | ✔️ | ✔️ | ✔️ |
Öppna LocalMachine\Otillåten (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
Öppna LocalMachine\Otillåten (ExistingOnly) | ✔️ | ❌ | ✔️ (om ReadOnly) | ✔️ (om ReadOnly) | ✔️ (om ReadOnly) |
I Linux används inte arkivet Disallowed
i kedjebyggande, och om du försöker lägga till innehåll i det resulterar det i en CryptographicException. En CryptographicException utlöses när butiken Disallowed
öppnas om den redan har hämtat innehåll.
I macOS är arkiven CurrentUser\Disallowed och LocalMachine\Disallowed tolkningar av lämpliga SecTrustSettings-resultat för certifikat vars förtroende är inställt på Always Deny
.
Obefintligt arkiv
Scenario | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Öppna ett arkiv som inte finns (ExistingOnly) | ❌ | ❌ | ❌ | ❌ | ❌ |
Öppna CurrentUser-arkivet som inte finns (ReadWrite) | ✔️ | ✔️ | ⚠️ | ❌ | ❌ |
Öppna LocalMachine non-existent store (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
På macOS stöds skapande av anpassade butiker med X509Store-API:et endast för CurrentUser
plats. Den skapar en ny nyckelring utan lösenord i användarens nyckelringskatalog (~/Bibliotek/nyckelringar). Om du vill skapa en nyckelring med lösenord kan en P/Invoke till SecKeychainCreate
användas. SecKeychainOpen
På samma sätt kan användas för att öppna nyckelringar på olika platser. IntPtr
Resultatet kan skickas till för new X509Store(IntPtr)
att hämta ett läs-/skrivkompatibelt arkiv, med förbehåll för den aktuella användarens behörigheter.
X509Chain
macOS stöder inte crl-användning offline, så X509RevocationMode.Offline
behandlas som X509RevocationMode.Online
.
macOS stöder inte en användarinitierad tidsgräns för nedladdning av CRL (listan över återkallade certifikat) /OCSP (Online Certificate Status Protocol) /AIA (Authority Information Access), så X509ChainPolicy.UrlRetrievalTimeout
ignoreras.