Кроссплатформенная криптография в .NET

Криптографические операции в .NET выполняются библиотеками операционной системы (ОС). Эта зависимость имеет преимущества:

  • Приложения .NET получают преимущества надежности ОС. Обеспечение безопасности библиотек шифрования от уязвимостей является высоким приоритетом для поставщиков ОС. Для этого они предоставляют обновления, которые должны применять системные администраторы.
  • Приложения .NET имеют доступ к проверенным алгоритмам FIPS, если библиотеки ОС проверяются с проверкой FIPS.

Зависимость от библиотек ОС также означает, что приложения .NET могут использовать только криптографические функции, поддерживаемые ОС. Хотя все платформы поддерживают некоторые основные функции, некоторые функции, поддерживаемые .NET, не могут использоваться на некоторых платформах. В этой статье определены функции, поддерживаемые на каждой платформе.

В этой статье предполагается, что у вас есть опыт работы с криптографией в .NET. Дополнительные сведения см. в статье .NET Cryptography Model and .NET Cryptographic Services.

Алгоритмы хэширования

Все классы хэш-алгоритма и хэш-проверки подлинности сообщений (HMAC), включая *Managed классы, откладывают в библиотеки ОС за исключением .NET в браузере WASM. В браузере WASM SHA-1, SHA-2-256, SHA-2-384, SHA-2-512 реализуются с помощью управляемого кода.

SHA-3

.NET 8 представила поддержку хэш-алгоритмов SHA-3, включая SHAKE-128 и SHAKE-256. Поддержка SHA-3 в настоящее время поддерживается в Windows 11 сборки 25324 или более поздней версии, а Linux — с OpenSSL 1.1.1 или более поздней версии.

Симметричное шифрование

Базовые шифры и цепочка выполняются системными библиотеками.

Шифр + режим 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

Шифрование, прошедшее проверку подлинности

Поддержка шифрования с проверкой подлинности (AE) предоставляется для AES-CCM, AES-GCM и ChaCha20Poly1305 через System.Security.Cryptography.AesCcmSystem.Security.Cryptography.AesGcmклассы и System.Security.Cryptography.ChaCha20Poly1305 классы соответственно.

Так как для поддержки алгоритма требуются более новые API платформы для проверки подлинности, поддержка может не присутствовать на всех платформах. IsSupported Статичное свойство для классов алгоритма можно использовать для обнаружения во время выполнения, если текущая платформа поддерживает алгоритм или нет.

Шифр + режим Windows Linux macOS iOS, tvOS, MacCatalyst Android Браузер
AES-GCM; ✔️ ✔️ ⚠️ ✔️
AES-CCM ✔️ ✔️ ⚠️ ✔️
ChaCha20Poly1305 Windows 10 Build 20142+ OpenSSL 1.1.0+ ⚠️ Уровень API 28+

AES-CCM в macOS

В macOS системные библиотеки не поддерживают AES-CCM для стороннего кода, поэтому AesCcm класс использует OpenSSL для поддержки. Пользователям в macOS необходимо получить соответствующую копию OpenSSL (libcrypto) для работы этого типа, и она должна находиться в пути, из-за того, что система загружает библиотеку по умолчанию. Рекомендуется установить OpenSSL из диспетчера пакетов, например Homebrew.

Библиотеки libcrypto.0.9.7.dylib , libcrypto.0.9.8.dylib включенные в macOS, относятся к более ранним версиям OpenSSL и не будут использоваться. libcrypto.41.dyliblibcrypto.42.dylib Библиотеки libcrypto.35.dylibи библиотеки из LibreSSL и не будут использоваться.

AES-GCM и ChaCha20Poly1305 в macOS

macOS не поддерживает AES-GCM или ChaCha20Poly1305 до macOS 10.15 для стороннего кода. До .NET 8 и имеет то же требование, что и ChaCha20Poly1305 AES-CCM, AesGcm и пользователи должны установить OpenSSL для этих типов для работы.

Начиная с .NET 8, .NET в macOS будет использовать платформу Apple CryptoKit для AES-GCM и ChaCha20Poly1305. Пользователям не нужно устанавливать или настраивать дополнительные зависимости для AES-GCM или ChaCha20Poly1305 в macOS.

Ключи AES-CCM, nonces и теги

  • Размеры ключей

    AES-CCM работает с 128, 192 и 256-разрядными ключами.

  • Размеры nonce

    Класс AesCcm поддерживает 56, 64, 72, 80, 88, 96 и 104-разрядные (7, 8, 9, 10, 11, 12 и 13-байтов).

  • Размеры тегов

    Класс AesCcm поддерживает создание или обработку тегов 32, 48, 64, 80, 96, 112 и 128-разрядных (4, 8, 10, 12, 14 и 16 байтов).

Ключи AES-GCM, nonces и теги

  • Размеры ключей

    AES-GCM работает с 128, 192 и 256-разрядными ключами.

  • Размеры nonce

    Класс AesGcm поддерживает только 96-разрядные (12-байтовые) nonces.

  • Размер тегов в Windows и Linux, AesGcm класс поддерживает создание или обработку тегов 96, 104, 112, 120 и 128-разрядных (12, 13, 14, 15 и 16-байтов). В macOS размер тега ограничен 128-разрядным (16-байтом) из-за ограничений платформы CryptoKit.

Ключи ChaCha20Poly1305, nonces и теги.

ChaCha20Poly1305 имеет фиксированный размер для тега ключа, nonce и проверки подлинности. ChaCha20Poly1305 всегда использует 256-разрядный ключ, 96-разрядный (12-байтовый) и 128-разрядный (16-байтовый) тег.

Асимметричная криптография

В этом разделе содержатся следующие подразделы:

RSA

Создание ключей RSA (Rivest-Shamir-Adleman) выполняется библиотеками ОС и зависит от их размеров и характеристик производительности.

Операции с ключами RSA выполняются библиотеками ОС, а типы ключей, которые могут быть загружены, подлежат требованиям к ОС.

.NET не предоставляет "необработанные" (непадные) операции RSA.

Поддержка заполнения и дайджеста зависит от платформы:

Режим заполнения Windows (CNG) Linux (OpenSSL) macOS iOS, tvOS, MacCatalyst Android Windows (CAPI)
Шифрование PKCS1 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
OAEP - SHA-1 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
OAEP - SHA-2 ✔️ ✔️ ✔️ ✔️ ✔️
OAEP - SHA-32 Сборка Windows 11 25324+ OpenSSL 1.1.1+
Подпись PKCS1 (MD5, SHA-1) ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Подпись PKCS1 (SHA-2) ✔️ ✔️ ✔️ ✔️ ✔️ ⚠️1
Подпись PKCS1 (SHA-3)2 Сборка Windows 11 25324+ OpenSSL 1.1.1+
PSS ✔️ ✔️ ✔️ ✔️ ✔️

1 Windows CryptoAPI (CAPI) поддерживает подпись PKCS1 с алгоритмом SHA-2. Но отдельный объект RSA может быть загружен в поставщик служб шифрования (CSP), который не поддерживает его.

Для 2 требуется .NET 8.

RSA в Windows

  • Windows CryptoAPI (CAPI) используется при каждом new RSACryptoServiceProvider() использовании.
  • Api шифрования Windows Next Generation (CNG) используется при new RSACng() каждом использовании.
  • Объект, возвращаемый RSA.Create внутренней мощностью Windows CNG. Это использование Windows CNG является подробной реализацией и подлежит изменению.
  • Метод GetRSAPublicKey расширения для X509Certificate2 возврата экземпляра RSACng . Это использование RSACng является подробным описанием реализации и подлежит изменению.
  • Метод GetRSAPrivateKey расширения для X509Certificate2 текущего RSACng случая предпочитает экземпляр, но если RSACng не удается открыть ключ, RSACryptoServiceProvider будет предпринята попытка. Предпочтительный поставщик является подробной информацией о реализации и подлежит изменению.

Собственный взаимодействие RSA

.NET предоставляет типы, позволяющие программам взаимодействовать с библиотеками ОС, которые использует код шифрования .NET. Используемые типы не преобразуются между платформами и должны использоваться только при необходимости.

Тип Windows Linux macOS iOS, tvOS, MacCatalyst Android
RSACryptoServiceProvider ✔️ ⚠️1 ⚠️1 ⚠️1 ⚠️1
RSACng ✔️
RSAOpenSsl ✔️ ⚠️2

1 В windows RSACryptoServiceProvider можно использовать для совместимости с существующими программами. В этом случае любой метод, требующий взаимодействия ОС, например открытие именованного ключа, вызывает исключение PlatformNotSupportedException.

2 В macOS работает, RSAOpenSsl если установлен OpenSSL и можно найти соответствующий libcrypto dylib с помощью динамической загрузки библиотеки. Если не удается найти соответствующую библиотеку, будут возникать исключения.

ECDSA

Создание ключа ECDSA (алгоритм цифровой подписи с многоточием) выполняется библиотеками ОС и зависит от их размеров и характеристик производительности.

Ключевые кривые ECDSA определяются библиотеками ОС и подвергаются их ограничениям.

эллиптическая кривая; Windows 10 Windows 7 — 8.1 Linux macOS iOS, tvOS, MacCatalyst Android
NIST P-256 (secp256r1) ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
NIST P-384 (secp384r1) ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
NIST P-521 (secp521r1) ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Кривые мозга (как именованные кривые) ✔️ ⚠️1 ⚠️4
Другие именованные кривые ⚠️2 ⚠️1 ⚠️4
Явные кривые ✔️ ✔️ ✔️
Экспорт или импорт как явный ✔️ 3 ✔️ 3 3 ✔️

1 Дистрибутивы Linux не поддерживают одинаковые именованные кривые.

2 Поддержка именованных кривых добавлена в Windows CNG в Windows 10. Дополнительные сведения см. в разделе CNG с именованными эллиптических кривыми. Именованные кривые недоступны в более ранних версиях Windows, за исключением трех кривых в Windows 7.

3 Экспорт с явными параметрами кривой требует поддержки библиотеки ОС, которая недоступна на платформах Apple или более ранних версиях Windows.

Поддержка 4 Android для некоторых кривых зависит от версии Android. Распространители Android могут также добавлять или удалять кривые из сборки Android.

Собственный взаимодействие ECDSA

.NET предоставляет типы, позволяющие программам взаимодействовать с библиотеками ОС, которые использует код шифрования .NET. Используемые типы не преобразуются между платформами и должны использоваться только непосредственно при необходимости.

Тип Windows Linux macOS iOS, tvOS, MacCatalyst Android
ECDsaCng ✔️
ECDsaOpenSsl ✔️ ⚠️*

* В macOS работает, ECDsaOpenSsl если OpenSSL установлен в системе, а соответствующий libcrypto dylib можно найти с помощью динамической загрузки библиотеки. Если не удается найти соответствующую библиотеку, будут возникать исключения.

ECDH

Создание ключей ECDH (Elliptic Curve Diffie-Hellman) выполняется библиотеками ОС и зависит от их ограничений размера и характеристик производительности.

Класс ECDiffieHellman поддерживает "необработанное" значение вычисления ECDH, а также с помощью следующих функций производного ключа:

  • HASH(Z)
  • HASH(prepend || Z || добавление)
  • HMAC(key, Z)
  • HMAC(key, prepend || Z || добавление)
  • HMAC(Z, Z)
  • HMAC(Z, предустановленная || Z || добавление)
  • Tls11Prf(label, seed)

В .NET 8 была введена производная клавиша Raw.

Ключевые кривые ECDH определяются библиотеками ОС и подвергаются их ограничениям.

эллиптическая кривая; Windows 10 Windows 7 — 8.1 Linux macOS iOS, tvOS, MacCatalyst Android
NIST P-256 (secp256r1) ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
NIST P-384 (secp384r1) ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
NIST P-521 (secp521r1) ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Кривые мозга (как именованные кривые) ✔️ ⚠️1 ⚠️4
Другие именованные кривые ⚠️2 ⚠️1 ⚠️4
Явные кривые ✔️ ✔️ ✔️
Экспорт или импорт как явный ✔️ 3 ✔️ 3 3 ✔️

1 Дистрибутивы Linux не поддерживают одинаковые именованные кривые.

2 Поддержка именованных кривых добавлена в Windows CNG в Windows 10. Дополнительные сведения см. в разделе CNG с именованными эллиптических кривыми. Именованные кривые недоступны в более ранних версиях Windows, за исключением трех кривых в Windows 7.

3 Экспорт с явными параметрами кривой требует поддержки библиотеки ОС, которая недоступна на платформах Apple или более ранних версиях Windows.

Поддержка 4 Android для некоторых кривых зависит от версии Android. Распространители Android могут также добавлять или удалять кривые из сборки Android.

Собственный взаимодействие ECDH

.NET предоставляет типы, позволяющие программам взаимодействовать с библиотеками ОС, которые использует .NET. Используемые типы не преобразуются между платформами и должны использоваться только непосредственно при необходимости.

Тип Windows Linux macOS iOS, tvOS, MacCatalyst Android
ECDiffieHellmanCng ✔️
ECDiffieHellmanOpenSsl ✔️ ⚠️*

* В macOS работает, ECDiffieHellmanOpenSsl если установлен OpenSSL и можно найти соответствующий libcrypto dylib с помощью динамической загрузки библиотеки. Если не удается найти соответствующую библиотеку, будут возникать исключения.

DSA

Создание ключей DSA (алгоритм цифровой подписи) выполняется системными библиотеками и зависит от ограничений размера и характеристик производительности.

Function Windows CNG Linux macOS Windows CAPI iOS, tvOS, MacCatalyst Android
Создание ключа (<= 1024 бита) ✔️ ✔️ ✔️ ✔️
Создание ключа (> 1024 бита) ✔️ ✔️ ✔️
Загрузка ключей (<= 1024 бит) ✔️ ✔️ ✔️ ✔️ ✔️
Загрузка ключей (> 1024 бита) ✔️ ✔️ ⚠️* ✔️
FIPS 186-2 ✔️ ✔️ ✔️ ✔️ ✔️
FIPS 186-3 (подписи SHA-2) ✔️ ✔️ ✔️

* macOS загружает ключи DSA больше 1024 бит, но поведение этих ключей не определено. Они не ведут себя в соответствии с FIPS 186-3.

DSA в Windows

  • Windows CryptoAPI (CAPI) используется при каждом new DSACryptoServiceProvider() использовании.
  • Api шифрования Windows Next Generation (CNG) используется при new DSACng() каждом использовании.
  • Объект, возвращаемый DSA.Create внутренней мощностью Windows CNG. Это использование Windows CNG является подробной реализацией и подлежит изменению.
  • Метод GetDSAPublicKey расширения для X509Certificate2 возврата экземпляра DSACng . Это использование DSACng является подробным описанием реализации и подлежит изменению.
  • GetDSAPrivateKey Метод расширения для X509Certificate2 предпочитаемого экземпляраDSACng, но если DSACng не удается открыть ключ, DSACryptoServiceProvider будет предпринята попытка. Предпочтительный поставщик является подробной информацией о реализации и подлежит изменению.

Собственный взаимодействие DSA

.NET предоставляет типы, позволяющие программам взаимодействовать с библиотеками ОС, которые использует код шифрования .NET. Используемые типы не преобразуются между платформами и должны использоваться только непосредственно при необходимости.

Тип Windows Linux macOS iOS, tvOS, MacCatalyst Android
DSACryptoServiceProvider ✔️ ⚠️1 ⚠️1 ⚠️1
DSACng ✔️
DSAOpenSsl ✔️ ⚠️2

1 В windows DSACryptoServiceProvider можно использовать для совместимости с существующими программами. В этом случае любой метод, требующий системного взаимодействия, например открытие именованного ключа, вызывает исключение PlatformNotSupportedException.

2 В macOS работает, DSAOpenSsl если установлен OpenSSL и можно найти соответствующий libcrypto dylib с помощью динамической загрузки библиотеки. Если не удается найти соответствующую библиотеку, будут возникать исключения.

Сертификаты X.509

Большая часть поддержки сертификатов X.509 в .NET поставляется из библиотек ОС. Чтобы загрузить сертификат в X509Certificate2 .NET или X509Certificate экземпляр, сертификат должен быть загружен базовой библиотекой ОС.

Чтение PKCS12/PFX

Сценарий Windows Linux macOS iOS, tvOS, MacCatalyst Android
Нет значения ✔️ ✔️ ✔️ ✔️ ✔️
Один сертификат, закрытый ключ не ✔️ ✔️ ✔️ ✔️ ✔️
Один сертификат с закрытым ключом ✔️ ✔️ ✔️ ✔️ ✔️
Несколько сертификатов, закрытых ключей нет ✔️ ✔️ ✔️ ✔️ ✔️
Несколько сертификатов, один закрытый ключ ✔️ ✔️ ✔️ ✔️ ✔️
Несколько сертификатов, несколько закрытых ключей ✔️ ✔️ ✔️ ✔️ ✔️

Запись PKCS12/PFX

Сценарий Windows Linux macOS iOS, tvOS, MacCatalyst Android
Нет значения ✔️ ✔️ ✔️ ✔️ ✔️
Один сертификат, закрытый ключ не ✔️ ✔️ ✔️ ✔️ ✔️
Один сертификат с закрытым ключом ✔️ ✔️ ✔️ ✔️ ✔️
Несколько сертификатов, закрытых ключей нет ✔️ ✔️ ✔️ ✔️ ✔️
Несколько сертификатов, один закрытый ключ ✔️ ✔️ ✔️ ✔️ ✔️
Несколько сертификатов, несколько закрытых ключей ✔️ ✔️ ✔️ ✔️ ✔️
Эфемерная загрузка ✔️ ✔️ ✔️ ✔️

macOS не может загружать закрытые ключи сертификата без объекта связка ключей, который требует записи на диск. Цепочки ключей создаются автоматически для загрузки PFX и удаляются, когда они больше не используются. Так как параметр X509KeyStorageFlags.EphemeralKeySet означает, что закрытый ключ не должен быть записан на диск, утверждая, что флаг в macOS приводит к тому, что он приводит к PlatformNotSupportedException.

Запись коллекции сертификатов PKCS7

Windows и Linux выдают большие двоичные объекты PKCS7 с кодировкой DER. macOS выдает большие двоичные объекты pKCS7 с неограниченной длиной в кодировке CER.

X509store

В X509Store Windows класс представляет API Магазина сертификатов Windows. Эти API работают так же в .NET Core и .NET 5, что и в платформа .NET Framework.

В X509Store Windows класс представляет собой проекцию решений доверия системы (только для чтения), решений доверия пользователей (чтение и запись) и хранилища ключей пользователя (чтение и запись).

В следующих таблицах показано, какие сценарии поддерживаются на каждой платформе. Для неподдерживаемых сценариев (❌ в таблицах) CryptographicException создается исключение.

Мой магазин

Сценарий Windows Linux macOS iOS, tvOS, MacCatalyst Android
Открытие CurrentUser\My (ReadOnly) ✔️ ✔️ ✔️ ✔️ ✔️
Открытие CurrentUser\My (ReadWrite) ✔️ ✔️ ✔️ ✔️ ✔️
Открытие CurrentUser\My (ExistingOnly) ✔️ ⚠️ ✔️ ✔️ ✔️
Открытие LocalMachine\My ✔️ ✔️ ✔️ ✔️

В Linux хранилища создаются при первой записи и по умолчанию не существуют пользовательские хранилища, поэтому открытие CurrentUser\My сбоем ExistingOnly может завершиться ошибкой.

В macOS CurrentUser\My хранилище по умолчанию связка ключей пользователя, которое по умолчанию.login.keychain Магазин LocalMachine\My .System.keychain

Корневое хранилище

Сценарий Windows Linux macOS iOS, tvOS, MacCatalyst Android
Открытие CurrentUser\Root (ReadOnly) ✔️ ✔️ ✔️ ✔️
Открытие CurrentUser\Root (ReadWrite) ✔️ ✔️
Открытие CurrentUser\Root (ExistingOnly) ✔️ ⚠️ ✔️ (если ReadOnly) ✔️ (если ReadOnly)
Открытие LocalMachine\Root (ReadOnly) ✔️ ✔️ ✔️ ✔️
Открытие LocalMachine\Root (ReadWrite) ✔️
Открытие LocalMachine\Root (ExistingOnly) ✔️ ⚠️ ✔️ (если ReadOnly) ✔️ (если ReadOnly)

В Linux LocalMachine\Root хранилище является интерпретацией пакета ЦС в пути по умолчанию для OpenSSL.

В macOS CurrentUser\Root хранилище представляет собой интерпретацию SecTrustSettings результатов для домена доверия пользователей. Хранилище LocalMachine\Root представляет собой интерпретацию SecTrustSettings результатов для доменов доверия администратора и системы.

Промежуточное хранилище

Сценарий Windows Linux macOS iOS, tvOS, MacCatalyst Android
Открытие CurrentUser\Intermediate (ReadOnly) ✔️ ✔️ ✔️
Открытие CurrentUser\Intermediate (ReadWrite) ✔️ ✔️
Открытие CurrentUser\Intermediate (ExistingOnly) ✔️ ⚠️ ✔️ (если ReadOnly)
Открытие LocalMachine\Intermediate (ReadOnly) ✔️ ✔️ ✔️
Открытие LocalMachine\Intermediate (ReadWrite) ✔️
Открытие LocalMachine\Intermediate (ExistingOnly) ✔️ ⚠️ ✔️ (если ReadOnly)

В Linux CurrentUser\Intermediate хранилище используется в качестве кэша при скачивании промежуточных ЦС своими записями доступа к данным центра в успешной сборке X509Chain. Хранилище LocalMachine\Intermediate — это интерпретация пакета ЦС в пути по умолчанию для OpenSSL.

В macOS CurrentUser\Intermediate магазин рассматривается как пользовательское хранилище. Сертификаты, добавленные в это хранилище, не влияют на сборку цепочки X.509.

Запрещенное хранилище

Сценарий Windows Linux macOS iOS, tvOS, MacCatalyst Android
Открытие CurrentUser\Disallowed (ReadOnly) ✔️ ⚠️ ✔️ ✔️ ✔️
Открытие CurrentUser\Disallowed (ReadWrite) ✔️ ⚠️
Открытие CurrentUser\Disallowed (ExistingOnly) ✔️ ⚠️ ✔️ (если ReadOnly) ✔️ (если ReadOnly) ✔️ (если ReadOnly)
Открытие LocalMachine\Disallowed (ReadOnly) ✔️ ✔️ ✔️ ✔️
Открытие LocalMachine\Disallowed (ReadWrite) ✔️
Открытие LocalMachine\Disallowed (ExistingOnly) ✔️ ✔️ (если ReadOnly) ✔️ (если ReadOnly) ✔️ (если ReadOnly)

В Linux Disallowed магазин не используется в создании цепочки и пытается добавить в него CryptographicExceptionсодержимое. При CryptographicException открытии Disallowed хранилища создается исключение, если оно уже приобрело содержимое.

В macOS в хранилищах CurrentUser\Disallowed и LocalMachine\Disallowed используются интерпретации соответствующих результатов SecTrust Параметры для сертификатов, для которых задано Always Denyзначение доверия.

Несуществующее хранилище

Сценарий Windows Linux macOS iOS, tvOS, MacCatalyst Android
Открытие несуществующего хранилища (ExistingOnly)
Открытие несуществующего хранилища CurrentUser (ReadWrite) ✔️ ✔️ ⚠️
Открытие несуществующего хранилища LocalMachine (ReadWrite) ✔️

В macOS создание пользовательского хранилища с помощью API X509Store поддерживается только для CurrentUser расположения. Он создаст новый связка ключей без пароля в каталоге связка ключей пользователя (~/Library/Keychains). Чтобы создать связка ключей с паролем, можно использовать P/InvokeSecKeychainCreate. Аналогичным образом SecKeychainOpen можно использовать для открытия связка ключей в разных расположениях. IntPtr Полученный результат можно передать для new X509Store(IntPtr) получения хранилища, поддерживающего чтение и запись, при условии разрешений текущего пользователя.

X509Chain

macOS не поддерживает использование автономных списков отзыва сертификатов, поэтому X509RevocationMode.Offline рассматривается как X509RevocationMode.Online.

macOS не поддерживает время ожидания, инициированное пользователем, в CRL (список отзыва сертификатов) / OCSP (протокол состояния онлайн-сертификатов) / AIA (доступ к данным центра), поэтому X509ChainPolicy.UrlRetrievalTimeout игнорируется.

Дополнительные ресурсы