Criptografia entre plataformas no .NET
As operações criptográficas no .NET são feitas por bibliotecas do sistema operacional (SO). Esta dependência tem vantagens:
- Os aplicativos .NET se beneficiam da confiabilidade do sistema operacional. Manter as bibliotecas de criptografia protegidas contra vulnerabilidades é uma alta prioridade para os fornecedores de sistemas operacionais. Para fazer isso, eles fornecem atualizações que os administradores de sistema devem aplicar.
- Os aplicativos .NET terão acesso a algoritmos validados por FIPS se as bibliotecas do sistema operacional forem validadas por FIPS.
A dependência das bibliotecas do sistema operacional também significa que os aplicativos .NET só podem usar recursos criptográficos suportados pelo sistema operacional. Embora todas as plataformas ofereçam suporte a determinados recursos principais, alguns recursos suportados pelo .NET não podem ser usados em algumas plataformas. Este artigo identifica os recursos suportados em cada plataforma.
Este artigo pressupõe que você tenha uma familiaridade de trabalho com criptografia no .NET. Para obter mais informações, consulte .NET Cryptography Model e .NET Cryptographic Services.
Algoritmos de autenticação de hash e mensagem
Todos os algoritmos de hash e classes de autenticação de mensagem baseada em hash (HMAC), incluindo as *Managed
classes, adiam para as bibliotecas do sistema operacional, com exceção do .NET no Browser WASM. No navegador WASM, SHA-1, SHA-2-256, SHA-2-384, SHA-2-512 e os equivalentes HMAC são implementados usando código gerenciado.
Algoritmo | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android | Browser |
---|---|---|---|---|---|---|
MD5 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
SHA-1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
SHA-2-256 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
SHA-2-384 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
SHA-2-512 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
SHA-3-256 | Windows 11 Compilação 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
SHA-3-384 | Windows 11 Compilação 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
SHA-3-512 | Windows 11 Compilação 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
AGITAÇÃO-128 | Windows 11 Compilação 25324+ | OpenSSL 1.1.1+2 | ❌ | ❌ | ❌ | ❌ |
AGITAÇÃO-256 | Windows 11 Compilação 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 Compilação 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
HMAC-SHA-3-384 | Windows 11 Compilação 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
HMAC-SHA-3-512 | Windows 11 Compilação 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
KMAC-1281 | Windows 11 Compilação 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
KMAC-2561 | Windows 11 Compilação 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
KMAC-XOF-1281 | Windows 11 Compilação 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
KMAC-XOF-2561 | Windows 11 Compilação 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
1 Disponível a partir do .NET 9.
2 A função de saída extensível de streaming (XOF) está disponível a partir do .NET 9. No Linux, isso requer OpenSSL 3.3.
Encriptação simétrica
As cifras subjacentes e o encadeamento são feitos pelas bibliotecas do sistema.
Cifra + Modo | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
AES-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
AES-BCE | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
AES-CFB8 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
AES-CFB128 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
3DES-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
3DES-BCE | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
3DES-CFB8 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
3DES-CFB64 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
DES-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
DES-BCE | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
DES-CFB8 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
RC2-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
RC2-BCE | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
RC2-CFB | ❌ | ❌ | ❌ | ❌ | ❌ |
Encriptação autenticada
O suporte à criptografia autenticada (AE) é fornecido para AES-CCM, AES-GCM e ChaCha20Poly1305 por meio das System.Security.Cryptography.AesCcmclasses , System.Security.Cryptography.AesGcme , respectivamente System.Security.Cryptography.ChaCha20Poly1305 .
Como a criptografia autenticada requer APIs de plataforma mais recentes para suportar o algoritmo, o suporte pode não estar presente em todas as plataformas. A IsSupported
propriedade static nas classes para o algoritmo pode ser usada para detetar em tempo de execução se a plataforma atual suporta o algoritmo ou não.
Cifra + Modo | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android | Browser |
---|---|---|---|---|---|---|
AES-GCM | ✔️ | ✔️ | ✔️ | ⚠️ | ✔️ | ❌ |
AES-CCM | ✔️ | ✔️ | ⚠️ | ❌ | ✔️ | ❌ |
ChaCha20Poly1305 | Windows 10 Compilação 20142+ | OpenSSL 1.1.0+ | ✔️ | ⚠️ | API Nível 28+ | ❌ |
AES-CCM no macOS
No macOS, as bibliotecas do sistema não suportam AES-CCM para código de terceiros, portanto, a AesCcm classe usa OpenSSL para suporte. Os usuários no macOS precisam obter uma cópia apropriada do OpenSSL (libcrypto) para que esse tipo funcione, e ele deve estar em um caminho do qual o sistema carregaria uma biblioteca por padrão. Recomendamos que você instale o OpenSSL a partir de um gerenciador de pacotes como o Homebrew.
As libcrypto.0.9.7.dylib
bibliotecas incluídas libcrypto.0.9.8.dylib
no macOS são de versões anteriores do OpenSSL e não serão usadas. O libcrypto.35.dylib
, libcrypto.41.dylib
e libcrypto.42.dylib
as bibliotecas são do LibreSSL e não serão usados.
AES-GCM e ChaCha20Poly1305 no iOS, tvOS e MacCatalyst
O suporte para AES-GCM e ChaCha20Poly1305 está disponível a partir do .NET 9 no iOS e tvOS 13.0 e posterior, e em todas as versões do MacCatalyst.
Chaves, nonces e tags AES-CCM
Tamanhos das chaves
AES-CCM funciona com chaves de 128, 192 e 256 bits.
Tamanhos Nonce
A AesCcm classe suporta nonces de 56, 64, 72, 80, 88, 96 e 104 bits (7, 8, 9, 10, 11, 12 e 13 bytes).
Tamanhos de tags
A AesCcm classe suporta a criação ou processamento de tags de 32, 48, 64, 80, 96, 112 e 128 bits (4, 8, 10, 12, 14 e 16 bytes).
Chaves, nonces e tags AES-GCM
Tamanhos das chaves
AES-GCM funciona com chaves de 128, 192 e 256 bits.
Tamanhos Nonce
A AesGcm classe suporta apenas nonces de 96 bits (12 bytes).
Tamanhos de tags No Windows e Linux, a classe suporta a AesGcm criação ou processamento de tags de 96, 104, 112, 120 e 128 bits (12, 13, 14, 15 e 16 bytes). Nas plataformas Apple, o tamanho da tag é limitado a 128 bits (16 bytes) devido a limitações da estrutura do CryptoKit.
ChaCha20Poly1305 chaves, nonces e tags.
ChaCha20Poly1305 tem um tamanho fixo para a chave, nonce e tag de autenticação. ChaCha20Poly1305 sempre usa uma chave de 256 bits, um nonce de 96 bits (12 bytes) e uma tag de 128 bits (16 bytes).
Criptografia assimétrica
Esta secção inclui as seguintes subsecções:
RSA
A geração de chaves RSA (Rivest–Shamir–Adleman) é realizada pelas bibliotecas do sistema operacional e está sujeita às suas limitações de tamanho e características de desempenho.
As operações de chave RSA são realizadas pelas bibliotecas do sistema operacional, e os tipos de chave que podem ser carregados estão sujeitos aos requisitos do sistema operacional.
O .NET não expõe operações RSA "brutas" (não acolchoadas).
O suporte a preenchimento e resumo varia de acordo com a plataforma:
Modo de preenchimento | Janelas (CNG) | Linux (OpenSSL) | macOS | iOS, tvOS, MacCatalyst | Android | Janelas (CAPI) |
---|---|---|---|---|---|---|
Criptografia PKCS1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
OAEP - SHA-1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
OAEP - SHA-2 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
OAEP - SHA-3 | Windows 11 Compilação 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
Assinatura PKCS1 (MD5, SHA-1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Assinatura PKCS1 (SHA-2) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ⚠️ 1 |
Assinatura PKCS1 (SHA-3) | Windows 11 Compilação 25324+ | OpenSSL 1.1.1+ | ❌ | ❌ | ❌ | ❌ |
PSS | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
1 Windows CryptoAPI (CAPI) é capaz de assinatura PKCS1 com um algoritmo SHA-2. Mas o objeto RSA individual pode ser carregado em um provedor de serviços de criptografia (CSP) que não oferece suporte a ele.
RSA no Windows
- Windows CryptoAPI (CAPI) é usado sempre que
new RSACryptoServiceProvider()
é usado. - A API de Criptografia do Windows Next Generation (CNG) é usada sempre que
new RSACng()
é usada. - O objeto retornado por RSA.Create é alimentado internamente pelo Windows CNG. Este uso do Windows CNG é um detalhe de implementação e está sujeito a alterações.
- O GetRSAPublicKey método de extensão para X509Certificate2 retorna uma RSACng instância. Este uso de é um detalhe de RSACng implementação e está sujeito a alterações.
- O GetRSAPrivateKey método de extensão para X509Certificate2 atualmente prefere uma RSACng instância, mas se RSACng não puder abrir a chave, RSACryptoServiceProvider será tentado. O provedor preferencial é um detalhe de implementação e está sujeito a alterações.
Interoperabilidade nativa RSA
O .NET expõe tipos para permitir que os programas interoperem com as bibliotecas do sistema operacional que o código de criptografia do .NET usa. Os tipos envolvidos não traduzem entre plataformas, e só devem ser usados diretamente quando necessário.
Type | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
RSACryptoServiceProvider | ✔️ | ⚠️ 1 | ⚠️ 1 | ⚠️ 1 | ⚠️ 1 |
RSACng | ✔️ | ❌ | ❌ | ❌ | ❌ |
RSAOpenSsl | ❌ | ✔️ | ⚠️ 2 | ❌ | ❌ |
1 Em não-Windows, RSACryptoServiceProvider pode ser usado para compatibilidade com programas existentes. Nesse caso, qualquer método que exija interoperabilidade do sistema operacional, como abrir uma chave nomeada, lança um PlatformNotSupportedExceptionarquivo .
2 No macOS, RSAOpenSsl funciona se o OpenSSL estiver instalado e um dylib libcrypto apropriado pode ser encontrado através do carregamento dinâmico da biblioteca. Se não for possível encontrar uma biblioteca apropriada, serão lançadas exceções.
ECDSA
A geração de chaves ECDSA (Elliptic Curve Digital Signature Algorithm) é feita pelas bibliotecas do sistema operacional e está sujeita às suas limitações de tamanho e características de desempenho.
As curvas-chave ECDSA são definidas pelas bibliotecas do SO e estão sujeitas às suas limitações.
Curva Elíptica | Windows 10 | Janelas 7 - 8.1 | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|---|
NIST P-256 (secp256r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
NIST P-384 (secp384r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
NIST P-521 (secp521r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Curvas de Brainpool (como curvas nomeadas) | ✔️ | ❌ | ⚠️ 1 | ❌ | ❌ | ⚠️ 4 |
Outras curvas nomeadas | ⚠️ 2 | ❌ | ⚠️ 1 | ❌ | ❌ | ⚠️ 4 |
Curvas explícitas | ✔️ | ❌ | ✔️ | ❌ | ❌ | ✔️ |
Exportar ou importar conforme explícito | ✔️ | ❌3 | ✔️ | ❌3 | ❌3 | ✔️ |
1 As distribuições Linux não têm suporte para as mesmas curvas nomeadas.
2 O suporte para curvas nomeadas foi adicionado ao Windows CNG no Windows 10. Para obter mais informações, consulte Curvas elípticas nomeadas CNG. As curvas nomeadas não estão disponíveis em versões anteriores do Windows, exceto para três curvas no Windows 7.
3 A exportação com parâmetros de curva explícitos requer suporte à biblioteca do sistema operacional, que não está disponível em plataformas Apple ou versões anteriores do Windows.
4 O suporte Android para algumas curvas depende da versão Android. Os distribuidores Android também podem optar por adicionar ou remover curvas da sua compilação Android.
Interoperabilidade Nativa ECDSA
O .NET expõe tipos para permitir que os programas interoperem com as bibliotecas do sistema operacional que o código de criptografia do .NET usa. Os tipos envolvidos não traduzem entre plataformas e só devem ser usados diretamente quando necessário.
Type | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
ECDsaCng | ✔️ | ❌ | ❌ | ❌ | ❌ |
ECDsaOpenSsl | ❌ | ✔️ | ⚠️* | ❌ | ❌ |
* No macOS, ECDsaOpenSsl funciona se o OpenSSL estiver instalado no sistema e um dylib libcrypto apropriado pode ser encontrado através do carregamento dinâmico da biblioteca. Se não for possível encontrar uma biblioteca apropriada, serão lançadas exceções.
ECDH
A geração de chaves ECDH (Elliptic Curve Diffie-Hellman) é feita pelas bibliotecas do sistema operacional e está sujeita às suas limitações de tamanho e características de desempenho.
A ECDiffieHellman classe suporta o valor "bruto" da computação ECDH, bem como através das seguintes funções de derivação chave:
- HASH(Z)
- HASH(prepend || Z || Anexar)
- HMAC (chave, Z)
- HMAC(chave, prepend || Z || Anexar)
- HMAC (Z, Z)
- HMAC(Z, pendente || Z || Anexar)
- Tls11Prf (rótulo, semente)
As curvas de teclas ECDH são definidas pelas bibliotecas do SO e estão sujeitas às suas limitações.
Curva Elíptica | Windows 10 | Janelas 7 - 8.1 | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|---|
NIST P-256 (secp256r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
NIST P-384 (secp384r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
NIST P-521 (secp521r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Curvas de Brainpool (como curvas nomeadas) | ✔️ | ❌ | ⚠️ 1 | ❌ | ❌ | ⚠️ 4 |
Outras curvas nomeadas | ⚠️ 2 | ❌ | ⚠️ 1 | ❌ | ❌ | ⚠️ 4 |
Curvas explícitas | ✔️ | ❌ | ✔️ | ❌ | ❌ | ✔️ |
Exportar ou importar conforme explícito | ✔️ | ❌3 | ✔️ | ❌3 | ❌3 | ✔️ |
1 As distribuições Linux não têm suporte para as mesmas curvas nomeadas.
2 O suporte para curvas nomeadas foi adicionado ao Windows CNG no Windows 10. Para obter mais informações, consulte Curvas elípticas nomeadas CNG. As curvas nomeadas não estão disponíveis em versões anteriores do Windows, exceto para três curvas no Windows 7.
3 A exportação com parâmetros de curva explícitos requer suporte à biblioteca do sistema operacional, que não está disponível em plataformas Apple ou versões anteriores do Windows.
4 O suporte Android para algumas curvas depende da versão Android. Os distribuidores Android também podem optar por adicionar ou remover curvas da sua compilação Android.
Interoperabilidade nativa do ECDH
O .NET expõe tipos para permitir que os programas interoperem com as bibliotecas do sistema operacional que o .NET usa. Os tipos envolvidos não traduzem entre plataformas e só devem ser usados diretamente quando necessário.
Type | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
ECDiffieHellmanCng | ✔️ | ❌ | ❌ | ❌ | ❌ |
ECDiffieHellmanOpenSsl | ❌ | ✔️ | ⚠️* | ❌ | ❌ |
* No macOS, ECDiffieHellmanOpenSsl funciona se o OpenSSL estiver instalado e um dylib libcrypto apropriado pode ser encontrado através do carregamento dinâmico da biblioteca. Se não for possível encontrar uma biblioteca apropriada, serão lançadas exceções.
DSA
A geração de chaves DSA (Digital Signature Algorithm) é realizada pelas bibliotecas do sistema e está sujeita às suas limitações de tamanho e características de desempenho.
Function | Windows CNG | Linux | macOS | Windows CAPI | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|---|
Criação de chaves (<= 1024 bits) | ✔️ | ✔️ | ❌ | ✔️ | ❌ | ✔️ |
Criação de chaves (> 1024 bits) | ✔️ | ✔️ | ❌ | ❌ | ❌ | ✔️ |
Carregando chaves (<= 1024 bits) | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
Teclas de carregamento (> 1024 bits) | ✔️ | ✔️ | ⚠️* | ❌ | ❌ | ✔️ |
FIPS 186-2 | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
FIPS 186-3 (assinaturas SHA-2) | ✔️ | ✔️ | ❌ | ❌ | ❌ | ✔️ |
* O macOS carrega chaves DSA maiores que 1024 bits, mas o comportamento dessas chaves é indefinido. Eles não se comportam de acordo com o FIPS 186-3.
DSA no Windows
- Windows CryptoAPI (CAPI) é usado sempre que
new DSACryptoServiceProvider()
é usado. - A API de Criptografia do Windows Next Generation (CNG) é usada sempre que
new DSACng()
é usada. - O objeto retornado por DSA.Create é alimentado internamente pelo Windows CNG. Este uso do Windows CNG é um detalhe de implementação e está sujeito a alterações.
- O GetDSAPublicKey método de extensão para X509Certificate2 retorna uma DSACng instância. Este uso de é um detalhe de DSACng implementação e está sujeito a alterações.
- O GetDSAPrivateKey método de extensão para X509Certificate2 prefere uma DSACng instância, mas se DSACng não puder abrir a chave, DSACryptoServiceProvider será tentado. O provedor preferencial é um detalhe de implementação e está sujeito a alterações.
Interoperabilidade nativa do DSA
O .NET expõe tipos para permitir que os programas interoperem com as bibliotecas do sistema operacional que o código de criptografia do .NET usa. Os tipos envolvidos não traduzem entre plataformas e só devem ser usados diretamente quando necessário.
Type | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
DSACryptoServiceProvider | ✔️ | ⚠️ 1 | ⚠️ 1 | ❌ | ⚠️ 1 |
DSACng | ✔️ | ❌ | ❌ | ❌ | ❌ |
DSAOpenSsl | ❌ | ✔️ | ⚠️ 2 | ❌ | ❌ |
1 Em não-Windows, DSACryptoServiceProvider pode ser usado para compatibilidade com programas existentes. Nesse caso, qualquer método que exija interoperabilidade do sistema, como abrir uma chave nomeada, lança um PlatformNotSupportedExceptionarquivo .
2 No macOS, DSAOpenSsl funciona se o OpenSSL estiver instalado e um dylib libcrypto apropriado pode ser encontrado através do carregamento dinâmico da biblioteca. Se não for possível encontrar uma biblioteca apropriada, serão lançadas exceções.
Certificados X.509
A maioria do suporte para certificados X.509 no .NET vem de bibliotecas do sistema operacional. Para carregar um certificado em uma X509Certificate2 instância ou X509Certificate no .NET, o certificado deve ser carregado pela biblioteca do sistema operacional subjacente.
Ler uma PKCS12/PFX
Cenário | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Vazio | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Um certificado, sem chave privada | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Um certificado, com chave privada | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Vários certificados, sem chaves privadas | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Vários certificados, uma chave privada | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Vários certificados, várias chaves privadas | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Escrever um PKCS12/PFX
Cenário | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Vazio | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Um certificado, sem chave privada | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Um certificado, com chave privada | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Vários certificados, sem chaves privadas | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Vários certificados, uma chave privada | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Vários certificados, várias chaves privadas | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Carregamento efêmero | ✔️ | ✔️ | ❌ | ✔️ | ✔️ |
O macOS não pode carregar chaves privadas de certificado sem um objeto de chaveiro, o que requer gravação em disco. As chaves são criadas automaticamente para carregamento PFX e são excluídas quando não estão mais em uso. Como a X509KeyStorageFlags.EphemeralKeySet opção significa que a chave privada não deve ser gravada no disco, afirmar esse sinalizador no macOS resulta em um PlatformNotSupportedExceptionarquivo .
Escrever uma coleção de certificados PKCS7
Windows e Linux emitem blobs PKCS7 codificados por DER. O macOS emite blobs PKCS7 codificados em CER de comprimento indefinido.
Loja X509
No Windows, a X509Store classe é uma representação das APIs do Repositório de Certificados do Windows. Essas APIs funcionam da mesma forma no .NET Core e no .NET 5 que no .NET Framework.
Em não-Windows, a X509Store classe é uma projeção de decisões de confiança do sistema (somente leitura), decisões de confiança do usuário (leitura-gravação) e armazenamento de chave do usuário (leitura-gravação).
As tabelas a seguir mostram quais cenários são suportados em cada plataforma. Para cenários sem suporte (❌ nas tabelas), um CryptographicException é lançado.
A minha loja
Cenário | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Abrir CurrentUser\My (ReadOnly) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Abrir CurrentUser\My (ReadWrite) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Abra CurrentUser\My (ExistingOnly) | ✔️ | ⚠️ | ✔️ | ✔️ | ✔️ |
Abrir LocalMachine\My | ✔️ | ❌ | ✔️ | ✔️ | ✔️ |
No Linux, as lojas são criadas na primeira gravação e não existem repositórios de usuários por padrão, portanto, abrir CurrentUser\My
com ExistingOnly
pode falhar.
No macOS, a CurrentUser\My
loja é o porta-chaves padrão do usuário, que é login.keychain
por padrão. A LocalMachine\My
loja é System.keychain
.
O repositório raiz
Cenário | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Abra CurrentUser\Root (somente leitura) | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
Abra CurrentUser\Root (ReadWrite) | ✔️ | ✔️ | ❌ | ❌ | ❌ |
Abra CurrentUser\Root (ExistingOnly) | ✔️ | ⚠️ | ✔️ (se ReadOnly) | ❌ | ✔️ (se ReadOnly) |
Abrir LocalMachine\Root (Somente leitura) | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
Abrir LocalMachine\Root (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
Abrir LocalMachine\Root (ExistingOnly) | ✔️ | ⚠️ | ✔️ (se ReadOnly) | ❌ | ✔️ (se ReadOnly) |
No Linux, a LocalMachine\Root
loja é uma interpretação do pacote CA no caminho padrão para OpenSSL.
No macOS, a CurrentUser\Root
loja é uma interpretação dos resultados para o domínio de confiança do SecTrustSettings
usuário. A LocalMachine\Root
loja é uma interpretação dos SecTrustSettings
resultados para os domínios de confiança do administrador e do sistema.
A loja intermediária
Cenário | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Abrir CurrentUser\Intermediate (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ❌ |
Abra CurrentUser\Intermediate (ReadWrite) | ✔️ | ✔️ | ❌ | ❌ | ❌ |
Abra CurrentUser\Intermediate (ExistingOnly) | ✔️ | ⚠️ | ✔️ (se ReadOnly) | ❌ | ❌ |
Abrir LocalMachine\Intermediate (somente leitura) | ✔️ | ✔️ | ✔️ | ❌ | ❌ |
Abrir LocalMachine\Intermediate (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
Abrir LocalMachine\Intermediate (ExistingOnly) | ✔️ | ⚠️ | ✔️ (se ReadOnly) | ❌ | ❌ |
No Linux, a CurrentUser\Intermediate
loja é usada como um cache ao baixar CAs intermediárias por seus registros de acesso a informações de autoridade em compilações X509Chain bem-sucedidas. O LocalMachine\Intermediate
repositório é uma interpretação do pacote CA no caminho padrão para OpenSSL.
No macOS, a CurrentUser\Intermediate
loja é tratada como uma loja personalizada. Os certificados adicionados a este repositório não afetam a construção da cadeia X.509.
A loja não permitida
Cenário | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Abrir CurrentUser\Disallowed (ReadOnly) | ✔️ | ⚠️ | ✔️ | ✔️ | ✔️ |
Abrir CurrentUser\Disallowed (ReadWrite) | ✔️ | ⚠️ | ❌ | ❌ | ❌ |
Abrir CurrentUser\Disallowed (ExistingOnly) | ✔️ | ⚠️ | ✔️ (se ReadOnly) | ✔️ (se ReadOnly) | ✔️ (se ReadOnly) |
Abrir LocalMachine\Disallowed (ReadOnly) | ✔️ | ❌ | ✔️ | ✔️ | ✔️ |
Abrir LocalMachine\Não permitido (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
Abrir LocalMachine\Disallowed (ExistingOnly) | ✔️ | ❌ | ✔️ (se ReadOnly) | ✔️ (se ReadOnly) | ✔️ (se ReadOnly) |
No Linux, a Disallowed
loja não é usada na construção de cadeias, e tentar adicionar conteúdo a ela resulta em um CryptographicExceptionarquivo . A CryptographicException é lançado ao abrir a Disallowed
loja se já tiver adquirido conteúdos.
No macOS, os repositórios CurrentUser\Disallowed e LocalMachine\Disallowed são interpretações dos resultados SecTrustSettings apropriados para certificados cuja confiança está definida como Always Deny
.
Loja inexistente
Cenário | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Abrir loja inexistente (ExistingOnly) | ❌ | ❌ | ❌ | ❌ | ❌ |
Abrir armazenamento inexistente CurrentUser (ReadWrite) | ✔️ | ✔️ | ⚠️ | ❌ | ❌ |
Abrir armazenamento inexistente LocalMachine (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
No macOS, a criação de lojas personalizadas com a API X509Store é suportada apenas para CurrentUser
localização. Ele criará um novo porta-chaves sem senha no diretório de chaves do usuário (~/Library/Keychains). Para criar um porta-chaves com senha, um P/Invoke para SecKeychainCreate
pode ser usado. Da mesma forma, SecKeychainOpen
poderia ser usado para abrir chaveiros em diferentes locais. O resultado IntPtr
pode ser passado para new X509Store(IntPtr)
obter um armazenamento com capacidade de leitura/gravação, sujeito às permissões do usuário atual.
X509Cadeia
O macOS não suporta a utilização de CRL offline, por isso X509RevocationMode.Offline
é tratado como X509RevocationMode.Online
.
O macOS não suporta um tempo limite iniciado pelo usuário no download de CRL (Lista de Revogação de Certificados) / OCSP (Online Certificate Status Protocol) / AIA (Authority Information Access), portanto X509ChainPolicy.UrlRetrievalTimeout
, é ignorado.