Partilhar via


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-2561 Windows 11 Compilação 25324+ OpenSSL 1.1.1+
SHA-3-3841 Windows 11 Compilação 25324+ OpenSSL 1.1.1+
SHA-3-5121 Windows 11 Compilação 25324+ OpenSSL 1.1.1+
AGITAÇÃO-1281 Windows 11 Compilação 25324+ OpenSSL 1.1.1+3
AGITAÇÃO-2561 Windows 11 Compilação 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 Compilação 25324+ OpenSSL 1.1.1+
HMAC-SHA-3-3841 Windows 11 Compilação 25324+ OpenSSL 1.1.1+
HMAC-SHA-3-5121 Windows 11 Compilação 25324+ OpenSSL 1.1.1+
KMAC-1282 Windows 11 Compilação 26016+ OpenSSL 3.0+
KMAC-2562 Windows 11 Compilação 26016+ OpenSSL 3.0+
KMAC-XOF-1282 Windows 11 Compilação 26016+ OpenSSL 3.0+
KMAC-XOF-2562 Windows 11 Compilação 26016+ OpenSSL 3.0+

1 Disponível a partir do .NET 8.

2 Disponível a partir do .NET 9.

3 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.dylibe libcrypto.42.dylib as bibliotecas são do LibreSSL e não serão usados.

AES-GCM e ChaCha20Poly1305 no macOS

O macOS não suportava AES-GCM ou ChaCha20Poly1305 até o macOS 10.15 para código de terceiros. Antes do .NET 8, AesGcm e ChaCha20Poly1305 têm o mesmo requisito que o AES-CCM e os usuários devem instalar o OpenSSL para que esses tipos funcionem.

A partir do .NET 8, o .NET no macOS usará a estrutura CryptoKit da Apple para AES-GCM e ChaCha20Poly1305. Os usuários não precisarão instalar ou configurar dependências adicionais para AES-GCM ou ChaCha20Poly1305 no macOS.

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-32 Windows 11 Compilação 25324+ OpenSSL 1.1.1+
Assinatura PKCS1 (MD5, SHA-1) ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Assinatura PKCS1 (SHA-2) ✔️ ✔️ ✔️ ✔️ ✔️ ️ 1
Assinatura PKCS1 (SHA-3)2 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.

2 Requer o .NET 8.

RSA no Windows

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)

A derivação de chave "bruta" foi introduzida no .NET 8.

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

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.

Recursos adicionais