Crittografia multipiattaforma in .NET
Le operazioni di crittografia in .NET vengono eseguite dalle librerie del sistema operativo (OS). Questa dipendenza presenta vari vantaggi:
- Le app .NET beneficiano dell’affidabilità del sistema operativo. Mantenere le librerie di crittografia al sicuro dalle vulnerabilità è una priorità elevata per i fornitori di sistemi operativi. A tale scopo, forniscono aggiornamenti che devono essere applicati dagli amministratori di sistema.
- Le app .NET hanno accesso agli algoritmi convalidati FIPS se le librerie del sistema operativo sono convalidate da FIPS.
La dipendenza dalle librerie del sistema operativo significa anche che le app .NET possono usare solo funzionalità di crittografia supportate dal sistema operativo. Sebbene tutte le piattaforme supportino determinate funzionalità di base, alcune funzionalità supportate da .NET non possono essere usate in alcune piattaforme. Questo articolo illustra le funzionalità supportate in ogni piattaforma.
Questo articolo presuppone che si abbia familiarità con la crittografia in .NET. Per ulteriori informazioni, consultare Modello di crittografia .NET e Servizi di crittografia .NET.
Algoritmi di autenticazione hash e messaggi
Tutte le classi HMAC (Hash Algorithm and Hash-Based Message Authentication), incluse le classi *Managed
, rimandano alle librerie del sistema operativo, ad eccezione di .NET in Browser WASM. Nel browser WASM, SHA-1, SHA-2-256, SHA-2-384, SHA-2-512 e gli equivalenti HMAC vengono implementati utilizzando codice gestito.
Algoritmo | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android | Browser |
---|---|---|---|---|---|---|
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+ | ❌ | ❌ | ❌ | ❌ |
1Disponibile a partire da .NET 8.
2Disponibile a partire da .NET 9.
3La funzione di output estendibile di streaming (XOF) è disponibile a partire da .NET 9. In Linux è necessario OpenSSL 3.3.
Crittografia simmetrica
Le crittografie e il concatenamento sottostanti vengono eseguite dalle librerie di sistema.
Crittografia e modalità | 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 | ❌ | ❌ | ❌ | ❌ | ❌ |
Crittografia autenticata
Il supporto della crittografia autenticata (AE) viene fornito rispettivamente per AES-CCM, AES-GCM e ChaCha20Poly1305 tramite le classi System.Security.Cryptography.AesCcm, System.Security.Cryptography.AesGcm e System.Security.Cryptography.ChaCha20Poly1305.
Poiché la crittografia dell'autenticazione richiede API della piattaforma più recenti per supportare l'algoritmo, il supporto potrebbe non essere presente in tutte le piattaforme. La proprietà statica IsSupported
delle classi per l'algoritmo può essere usata per rilevare durante il runtime se la piattaforma corrente supporta o meno l'algoritmo.
Crittografia e modalità | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android | Browser |
---|---|---|---|---|---|---|
AES-GCM | ✔️ | ✔️ | ⚠️ | ⚠️ | ✔️ | ❌ |
AES-CCM | ✔️ | ✔️ | ⚠️ | ❌ | ✔️ | ❌ |
ChaCha20Poly1305 | Windows 10 Build 20142+ | OpenSSL 1.1.0+ | ⚠️ | ⚠️ | Livello API 28+ | ❌ |
AES-CCM in macOS
In macOS, le librerie di sistema non supportano AES-CCM per codice di terzi, quindi la classe AesCcm usa OpenSSL per supporto. Gli utenti di macOS devono ottenere una copia adatta di OpenSSL (libcrypto) perché questo possa funzionare, e deve trovarsi in un percorso da cui il sistema caricherebbe una libreria per impostazione predefinita. È consigliabile installare OpenSSL da una gestione pacchetti, come Homebrew.
Le librerie libcrypto.0.9.7.dylib
e libcrypto.0.9.8.dylib
incluse in macOS provengono da versioni precedenti di OpenSSL e non saranno usate. Le librerie libcrypto.35.dylib
, libcrypto.41.dylib
e libcrypto.42.dylib
provengono da LibreSSL e non saranno usate.
AES-GCM e ChaCha20Poly1305 in macOS
macOS non supporta AES-GCM o ChaCha20Poly1305 fino a macOS 10.15 per codice di terzi. In versioni precedenti a .NET 8, AesGcm e ChaCha20Poly1305 hanno lo stesso requisito di AES-CCM e gli utenti devono installare OpenSSL perché questi tipi possano funzionare.
A partire da .NET 8, .NET in macOS userà il framework CryptoKit di Apple per AES-GCM e ChaCha20Poly1305. Gli utenti non dovranno installare o configurare dipendenze aggiuntive per AES-GCM o ChaCha20Poly1305 in macOS.
AES-GCM e ChaCha20Poly1305 in iOS, tvOS e MacCatalyst
Il supporto per AES-GCM e ChaCha20Poly1305 è disponibile a partire da .NET 9 in iOS e tvOS 13.0 e versioni successive e tutte le versioni di MacCatalyst.
Chiavi, nonce e tag AES-CCM
Dimensioni chiave
AES-CCM funziona con chiavi a 128, 192 e a 256 bit.
Dimensioni nonce
La classe AesCcm supporta 56, 64, 72, 80, 88, 96 e 104 bit (7, 8, 9, 10, 11, 12 e 13 byte).
Dimensioni tag
La classe AesCcm supporta la creazione o l'elaborazione di tag 32, 48, 64, 80, 96, 112 e 128 bit (4, 8, 10, 12, 14 e 16 byte).
Chiavi, nonce e tag AES-GCM
Dimensioni chiave
AES-GCM funziona con chiavi a 128, 192 e a 256 bit.
Dimensioni nonce
La classe AesGcm supporta solo nonce a 96 bit (12 byte).
Dimensioni tag in Windows e Linux, la classe AesGcm supporta la creazione o l'elaborazione di tag 96, 104, 112, 120 e 128 bit (12, 13, 14, 15 e 16 byte). Sulle piattaforme Apple, la dimensione del tag è limitata a 128 bit (16 byte) a causa delle limitazioni del framework CryptoKit.
Chiavi ChaCha20Poly1305, nonce e tag.
ChaCha20Poly1305 ha una dimensione fissa per il tag di autenticazione, nonce e chiave. ChaCha20Poly1305 usa sempre un tag a 256 bit, un nonce a 96 bit (12 byte) e un tag a 128 bit (16 byte).
Crittografia asimmetrica
Questa sezione include le seguenti sottosezioni:
RSA
La generazione di chiavi RSA (Rivest–Shamir-Adleman) viene eseguita dalle librerie del sistema operativo ed è soggetta alle relative limitazioni di dimensioni e caratteristiche delle prestazioni.
Le operazioni chiave RSA vengono eseguite dalle librerie del sistema operativo e i tipi di chiave che possono essere caricati sono soggetti ai requisiti del sistema operativo.
.NET non espone operazioni RSA "raw" (senza spaziatura interna).
Il supporto di spaziatura interna e di digest varia in base alla piattaforma:
Modalità di riempimento | Windows (CNG) | Linux (OpenSSL) | macOS | iOS, tvOS, MacCatalyst | Android | Windows (CAPI) |
---|---|---|---|---|---|---|
Crittografia PKCS1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
OAEP - SHA-1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
OAEP - SHA-2 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
OAEP - SHA-32 | Windows 11 Build 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
Firma PKCS1 (MD5, SHA-1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Firma PKCS1 (SHA-2) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ⚠️1 |
Firma PKCS1 (SHA-3)2 | Windows 11 Build 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
PSS | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
1 Windows CryptoAPI (CAPI) è in grado di effettuare una firma PKCS1 con un algoritmo SHA-2. Tuttavia, il singolo oggetto RSA potrebbe essere caricato in un provider di servizi di crittografia (CSP) nel quale non è supportato.
2 Richiede .NET 8.
RSA in Windows
- Windows CryptoAPI (CAPI) viene usato ogni volta che
new RSACryptoServiceProvider()
è in uso. - Windows Cryptography API Next Generation (CNG) viene usato ogni volta che
new RSACng()
è in uso. - L'oggetto restituito da RSA.Create è alimentato internamente da Windows CNG. Questo uso di Windows CNG è un dettaglio di implementazione ed è soggetto a modifiche.
- Il metodo di estensione GetRSAPublicKey per X509Certificate2 restituisce un'istanza di RSACng. Questo uso di RSACng è un dettaglio di implementazione ed è soggetto a modifiche.
- Attualmente, il metodo di estensione GetRSAPrivateKey per X509Certificate2 preferisce un'istanza RSACng, ma se RSACng non può aprire la chiave, verrà eseguito un tentativo di RSACryptoServiceProvider. Il provider preferito è un dettaglio di implementazione ed è soggetto a modifiche.
Interoperabilità nativa RSA
.NET espone tipi per consentire ai programmi di interagire con le librerie del sistema operativo usate dal codice di crittografia .NET. I tipi coinvolti non si traducono tra piattaforme e devono essere usati direttamente solo quando necessario.
Type | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
RSACryptoServiceProvider | ✔️ | ⚠️1 | ⚠️1 | ⚠️1 | ⚠️1 |
RSACng | ✔️ | ❌ | ❌ | ❌ | ❌ |
RSAOpenSsl | ❌ | ✔️ | ⚠️2 | ❌ | ❌ |
1 In sistemi diversi da Windows, RSACryptoServiceProvider può essere usato per la compatibilità con programmi esistenti. In tal caso, qualsiasi metodo che richieda l'interoperabilità del sistema operativo (ad esempio, l'apertura di una chiave denominata) genera un'eccezione PlatformNotSupportedException.
2 In macOS, RSAOpenSsl sarà funzionante se OpenSSL è installato e un dylib libcrypto adatto può essere trovato tramite il caricamento della libreria dinamica. Se non è possibile trovare una libreria adatta, verranno generate eccezioni.
ECDSA
La generazione di chiavi ECDSA (Elliptic Curve Digital Signature Algorithm) viene eseguita dalle librerie del sistema operativo ed è soggetta alle relative limitazioni di dimensioni e caratteristiche delle prestazioni.
Le curve chiave ECDSA sono definite dalle librerie del sistema operativo e sono soggette alle relative limitazioni.
Curva ellittica | Windows 10 | Windows 7 - 8.1 | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|---|
NIST P-256 (secp256r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
NIST P-384 (secp384r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
NIST P-521 (secp521r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Curve brainpool (come curve denominate) | ✔️ | ❌ | ⚠️1 | ❌ | ❌ | ⚠️4 |
Altre curve denominate | ⚠️2 | ❌ | ⚠️1 | ❌ | ❌ | ⚠️4 |
Curve esplicite | ✔️ | ❌ | ✔️ | ❌ | ❌ | ✔️ |
Esportare o importare come esplicite | ✔️ | ❌3 | ✔️ | ❌3 | ❌3 | ✔️ |
1 Non tutte le distribuzioni di Linux supportano le stesse curve denominate.
2 Il supporto per le curve denominate è stato aggiunto a Windows CNG in Windows 10. Per ulteriori informazioni, consultare Curva ellittica denominata CNG. Le curve denominate non sono disponibili nelle versioni precedenti di Windows, ad eccezione di tre curve in Windows 7.
3 L'esportazione con parametri di curva espliciti richiede il supporto della libreria del sistema operativo, che non è disponibile nelle piattaforme Apple o nelle versioni precedenti di Windows.
4 Il supporto Android per alcune curve dipende dalla versione di Android. I distributori Android possono scegliere di aggiungere o rimuovere curve anche dalla compilazione Android.
Interoperabilità nativa ECDSA
.NET espone tipi per consentire ai programmi di interagire con le librerie del sistema operativo usate dal codice di crittografia .NET. I tipi coinvolti non si traducono tra piattaforme e devono essere usati direttamente solo quando necessario.
Type | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
ECDsaCng | ✔️ | ❌ | ❌ | ❌ | ❌ |
ECDsaOpenSsl | ❌ | ✔️ | ⚠️* | ❌ | ❌ |
* In macOS, ECDsaOpenSsl sarà funzionante se OpenSSL è installato nel sistema e un dylib libcrypto adatto può essere trovato tramite il caricamento della libreria dinamica. Se non è possibile trovare una libreria adatta, verranno generate eccezioni.
ECDH
La generazione di chiavi ECDH (Elliptic Curve Diffie-Hellman) viene eseguita dalle librerie del sistema operativo ed è soggetta alle relative limitazioni di dimensioni e caratteristiche delle prestazioni.
La classe ECDiffieHellman supporta il valore "raw" del calcolo ECDH, nonché tramite le seguenti funzioni di derivazione chiave:
- HASH(Z)
- HASH(prepend || Z || append)
- HMAC(key, Z)
- HMAC(key, prepend || Z || append)
- HMAC(Z, Z)
- HMAC(Z, prepend || Z || append)
- Tls11Prf(label, seed)
La derivazione della chiave "Raw" è stata introdotta in .NET 8.
Le curve chiave ECDH sono definite dalle librerie del sistema operativo e sono soggette alle relative limitazioni.
Curva ellittica | Windows 10 | Windows 7 - 8.1 | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|---|
NIST P-256 (secp256r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
NIST P-384 (secp384r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
NIST P-521 (secp521r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Curve brainpool (come curve denominate) | ✔️ | ❌ | ⚠️1 | ❌ | ❌ | ⚠️4 |
Altre curve denominate | ⚠️2 | ❌ | ⚠️1 | ❌ | ❌ | ⚠️4 |
Curve esplicite | ✔️ | ❌ | ✔️ | ❌ | ❌ | ✔️ |
Esportare o importare come esplicite | ✔️ | ❌3 | ✔️ | ❌3 | ❌3 | ✔️ |
1 Non tutte le distribuzioni di Linux supportano le stesse curve denominate.
2 Il supporto per le curve denominate è stato aggiunto a Windows CNG in Windows 10. Per ulteriori informazioni, consultare Curva ellittica denominata CNG. Le curve denominate non sono disponibili nelle versioni precedenti di Windows, ad eccezione di tre curve in Windows 7.
3 L'esportazione con parametri di curva espliciti richiede il supporto della libreria del sistema operativo, che non è disponibile nelle piattaforme Apple o nelle versioni precedenti di Windows.
4 Il supporto Android per alcune curve dipende dalla versione di Android. I distributori Android possono scegliere di aggiungere o rimuovere curve anche dalla compilazione Android.
Interoperabilità nativa ECDH
.NET espone tipi per consentire ai programmi di interagire con le librerie del sistema operativo usate da .NET. I tipi coinvolti non si traducono tra piattaforme e devono essere usati direttamente solo quando necessario.
Type | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
ECDiffieHellmanCng | ✔️ | ❌ | ❌ | ❌ | ❌ |
ECDiffieHellmanOpenSsl | ❌ | ✔️ | ⚠️* | ❌ | ❌ |
* In macOS, ECDiffieHellmanOpenSsl sarà funzionante se OpenSSL è installato e un dylib libcrypto adatto può essere trovato tramite il caricamento della libreria dinamica. Se non è possibile trovare una libreria adatta, verranno generate eccezioni.
DSA
La generazione di chiavi DSA (Digital Signature Algorithm) viene eseguita dalle librerie di sistema ed è soggetta alle relative limitazioni di dimensioni e caratteristiche delle prestazioni.
Funzione | Windows CNG | Linux | macOS | Windows CAPI | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|---|
Creazione della chiave (<= 1024 bit) | ✔️ | ✔️ | ❌ | ✔️ | ❌ | ✔️ |
Creazione della chiave (> 1024 bit) | ✔️ | ✔️ | ❌ | ❌ | ❌ | ✔️ |
Caricamento delle chiavi (<= 1024 bit) | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
Caricamento delle chiavi (> 1024 bit) | ✔️ | ✔️ | ⚠️* | ❌ | ❌ | ✔️ |
FIPS 186-2 | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
FIPS 186-3 (firme SHA-2) | ✔️ | ✔️ | ❌ | ❌ | ❌ | ✔️ |
* macOS carica le chiavi DSA superiori a 1024 bit, ma il comportamento di tali chiavi non è definito. Non si comportano secondo FIPS 186-3.
DSA in Windows
- Windows CryptoAPI (CAPI) viene usato ogni volta che
new DSACryptoServiceProvider()
è in uso. - Windows Cryptography API Next Generation (CNG) viene usato ogni volta che
new DSACng()
è in uso. - L'oggetto restituito da DSA.Create è alimentato internamente da Windows CNG. Questo uso di Windows CNG è un dettaglio di implementazione ed è soggetto a modifiche.
- Il metodo di estensione GetDSAPublicKey per X509Certificate2 restituisce un'istanza DSACng. Questo uso di DSACng è un dettaglio di implementazione ed è soggetto a modifiche.
- Il metodo di estensione GetDSAPrivateKey per X509Certificate2 preferisce un'istanza DSACng, ma se DSACng non può aprire la chiave, verrà eseguito un tentativo di DSACryptoServiceProvider. Il provider preferito è un dettaglio di implementazione ed è soggetto a modifiche.
Interoperabilità nativa di DSA
.NET espone tipi per consentire ai programmi di interagire con le librerie del sistema operativo usate dal codice di crittografia .NET. I tipi coinvolti non si traducono tra piattaforme e devono essere usati direttamente solo quando necessario.
Type | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
DSACryptoServiceProvider | ✔️ | ⚠️1 | ⚠️1 | ❌ | ⚠️1 |
DSACng | ✔️ | ❌ | ❌ | ❌ | ❌ |
DSAOpenSsl | ❌ | ✔️ | ⚠️2 | ❌ | ❌ |
1 In sistemi diversi da Windows, DSACryptoServiceProvider può essere usato per la compatibilità con programmi esistenti. In tal caso, qualsiasi metodo che richieda l'interoperabilità del sistema operativo (ad esempio, l'apertura di una chiave denominata) genera un'eccezione PlatformNotSupportedException.
2 In macOS, DSAOpenSsl sarà funzionante se OpenSSL è installato e un dylib libcrypto adatto può essere trovato tramite il caricamento della libreria dinamica. Se non è possibile trovare una libreria adatta, verranno generate eccezioni.
Certificati X.509
La maggior parte del supporto per i certificati X.509 in .NET proviene dalle librerie del sistema operativo. Per caricare un certificato in un'istanza X509Certificate2 o X509Certificate in .NET, il certificato deve essere caricato dalla libreria del sistema operativo sottostante.
Leggere un pkCS12/PFX
Scenario | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Vuoto | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Un certificato, nessuna chiave privata | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Un certificato, con chiave privata | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Più certificati, nessuna chiave privata | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Più certificati, una chiave privata | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Più certificati, più chiavi private | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Scrivere un pkCS12/PFX
Scenario | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Vuoto | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Un certificato, nessuna chiave privata | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Un certificato, con chiave privata | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Più certificati, nessuna chiave privata | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Più certificati, una chiave privata | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Più certificati, più chiavi private | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Caricamento temporaneo | ✔️ | ✔️ | ❌ | ✔️ | ✔️ |
macOS non può caricare chiavi private del certificato senza un oggetto keychain, che richiede la scrittura su disco. I keychain vengono creati automaticamente per il caricamento PFX e vengono eliminati quando non più in uso. Poiché l'opzione X509KeyStorageFlags.EphemeralKeySet indica che la chiave privata non deve essere scritta su disco, l'asserzione del flag in macOS comporta la generazione di un PlatformNotSupportedException.
Scrivere una raccolta di certificati PKCS7
Sia Windows che Linux generano BLOB PKCS7 con codifica DER. macOS genera BLOB PKCS7 codificati a lunghezza indefinita.
X509Store
In Windows, la classe X509Store è una rappresentazione delle API dell'archivio certificati di Windows. Queste API funzionano in .NET Core e .NET 5 come in .NET Framework.
In sistemi operativi diversi da Windows, la classe X509Store è una proiezione di decisioni di attendibilità del sistema (sola lettura), decisioni di attendibilità utente (lettura/scrittura) e archiviazione delle chiavi utente (lettura/scrittura).
Le seguenti tabelle illustrano gli scenari supportati in ogni piattaforma. Per gli scenari non supportati (❌ nelle tabelle), viene generata un'eccezione CryptographicException.
Il mio archivio
Scenario | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Aprire CurrentUser\My (ReadOnly) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Aprire CurrentUser\My (ReadWrite) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Aprire CurrentUser\My (ExistingOnly) | ✔️ | ⚠️ | ✔️ | ✔️ | ✔️ |
Aprire LocalMachine\My | ✔️ | ❌ | ✔️ | ✔️ | ✔️ |
In Linux, gli archivi vengono creati durante la prima scrittura e non esistono archivi utente predefiniti, quindi l'apertura di CurrentUser\My
con ExistingOnly
potrebbe non riuscire.
In macOS, l'archivio CurrentUser\My
è il keychain predefinito dell'utente, che è login.keychain
per impostazione predefinita. L'archivio LocalMachine\My
è System.keychain
.
Archivio radice
Scenario | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Aprire CurrentUser\Root (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
Aprire CurrentUser\Root (ReadWrite) | ✔️ | ✔️ | ❌ | ❌ | ❌ |
Aprire CurrentUser\Root (ExistingOnly) | ✔️ | ⚠️ | ✔️ (se ReadOnly) | ❌ | ✔️ (se ReadOnly) |
Aprire LocalMachine\Root (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
Aprire LocalMachine\Root (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
Aprire LocalMachine\Root (ExistingOnly) | ✔️ | ⚠️ | ✔️ (se ReadOnly) | ❌ | ✔️ (se ReadOnly) |
In Linux, l'archivio LocalMachine\Root
è un'interpretazione del bundle CA nel percorso predefinito per OpenSSL.
In macOS, l'archivio CurrentUser\Root
è un'interpretazione dei risultati SecTrustSettings
per il dominio di attendibilità utente. L'archivio LocalMachine\Root
è un'interpretazione dei risultati SecTrustSettings
per i domini di attendibilità di sistema e amministratore.
Archivio intermedio
Scenario | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Aprire CurrentUser\Intermediate (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ❌ |
Aprire CurrentUser\Intermediate (ReadWrite) | ✔️ | ✔️ | ❌ | ❌ | ❌ |
Aprire CurrentUser\Intermediate (ExistingOnly) | ✔️ | ⚠️ | ✔️ (se ReadOnly) | ❌ | ❌ |
Aprire LocalMachine\Intermediate (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ❌ |
Aprire LocalMachine\Intermediate (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
Aprire LocalMachine\Intermediate (ExistingOnly) | ✔️ | ⚠️ | ✔️ (se ReadOnly) | ❌ | ❌ |
In Linux, l'archivio CurrentUser\Intermediate
viene usato come cache quando si scaricano CA intermedie dai record di Accesso alle informazioni sull'autorità nelle build X509Chain riuscite. L'archivio LocalMachine\Intermediate
è un'interpretazione del bundle CA nel percorso predefinito per OpenSSL.
In macOS, l'archivio CurrentUser\Intermediate
viene considerato un archivio personalizzato. I certificati aggiunti a questo archivio non influiscono sulla compilazione della catena X.509.
Archivio non consentito
Scenario | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Aprire CurrentUser\Disallowed (ReadOnly) | ✔️ | ⚠️ | ✔️ | ✔️ | ✔️ |
Aprire CurrentUser\Disallowed (ReadWrite) | ✔️ | ⚠️ | ❌ | ❌ | ❌ |
Aprire CurrentUser\Disallowed (ExistingOnly) | ✔️ | ⚠️ | ✔️ (se ReadOnly) | ✔️ (se ReadOnly) | ✔️ (se ReadOnly) |
Aprire LocalMachine\Disallowed (ReadOnly) | ✔️ | ❌ | ✔️ | ✔️ | ✔️ |
Aprire LocalMachine\Disallowed (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
Aprire LocalMachine\Disallowed (ExistingOnly) | ✔️ | ❌ | ✔️ (se ReadOnly) | ✔️ (se ReadOnly) | ✔️ (se ReadOnly) |
In Linux, l'archivio Disallowed
non viene usato nella compilazione a catena e il tentativo di aggiungervi contenuto comporta un CryptographicException. Un‘eccezione CryptographicException viene generata quando si apre lo store Disallowed
se questo ha già acquisito contenuti.
In macOS, gli archivi CurrentUser\Disallowed e LocalMachine\Disallowed sono interpretazioni dei risultati di SecTrustSettings appropriati per i certificati il cui trust è impostato su Always Deny
.
Archivio inesistente
Scenario | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Aprire un archivio inesistente (ExistingOnly) | ❌ | ❌ | ❌ | ❌ | ❌ |
Aprire l'archivio CurrentUser inesistente (ReadWrite) | ✔️ | ✔️ | ⚠️ | ❌ | ❌ |
Aprire l'archivio LocalMachine inesistente (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
In macOS, la creazione di archivi personalizzati con l'API X509Store è supportata solo per la posizioneCurrentUser
. Creerà un nuovo portachiavi senza password nella directory portachiavi dell'utente (~/Library/Keychains). Per creare un portachiavi con password, è possibile usare un P/Invoke. SecKeychainCreate
Analogamente, SecKeychainOpen
può essere usato per aprire keychain in diverse posizioni. L'oggetto risultante IntPtr
può essere passato a new X509Store(IntPtr)
per ottenere un archivio capace di lettura/scrittura, soggetto alle autorizzazioni dell'utente corrente.
X509Chain
macOS non supporta l'utilizzo di CRL offline, quindi X509RevocationMode.Offline
viene considerato come X509RevocationMode.Online
.
macOS non supporta un timeout avviato dall'utente in CRL (Certificate Revocation List), OCSP (Online Certificate Status Protocol), o AIA (Authority Information Access), quindi X509ChainPolicy.UrlRetrievalTimeout
viene ignorato.