Бөлісу құралы:


Кроссплатформенная криптография в .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 и эквиваленты HMAC реализуются с помощью управляемого кода.

Алгоритм Виндоус Линукс macOS iOS, tvOS, MacCatalyst Андроид Браузер
MD5 ✔️ ✔️ ✔️ ✔️ ✔️
SHA-1 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
SHA-2-256 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
SHA-2-384 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
SHA-2-512 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
SHA-3-256 Сборка Windows 11 25324+ OpenSSL 1.1.1+
SHA-3-384 Сборка Windows 11 25324+ OpenSSL 1.1.1+
SHA-3-512 Сборка Windows 11 25324+ OpenSSL 1.1.1+
SHAKE-128 Сборка Windows 11 25324+ OpenSSL 1.1.1+2
SHAKE-256 Сборка Windows 11 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 25324+ OpenSSL 1.1.1+
HMAC-SHA-3-384 Сборка Windows 11 25324+ OpenSSL 1.1.1+
HMAC-SHA-3-512 Сборка Windows 11 25324+ OpenSSL 1.1.1+
KMAC-1281 Windows 11 Build 26016+ OpenSSL 3.0+
KMAC-2561 Windows 11 Build 26016+ OpenSSL 3.0+
KMAC-XOF-1281 Windows 11 Build 26016+ OpenSSL 3.0+
KMAC-XOF-2561 Windows 11 Build 26016+ OpenSSL 3.0+

1Доступно начиная с .NET 9.

2Расширяемая выходная функция потоковой передачи (XOF) доступна начиная с .NET 9. В Linux для этого требуется OpenSSL 3.3.

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

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

Шифр + режим Виндоус Линукс macOS iOS, tvOS, MacCatalyst Андроид
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.AesCcm, System.Security.Cryptography.AesGcm и System.Security.Cryptography.ChaCha20Poly1305 соответственно.

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

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

AES-CCM в macOS

До .NET 10 AES-CCM работал, если была представлена поддерживаемая версия OpenSSL, а загрузчик динамической библиотеки мог его найти. Поддержка OpenSSL в macOS была удалена в .NET 10.

AES-GCM и ChaCha20Poly1305 в iOS, tvOS и MacCatalyst

Поддержка AES-GCM и ChaCha20Poly1305 доступна начиная с .NET 9 в iOS и tvOS 13.0 и более поздних версиях, а также для всех версий MacCatalyst.

Ключи AES-CCM, нонсы и теги

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

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

  • Размеры nonce

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

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

    Класс 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 байт). На платформах Apple размер тега ограничен 128-разрядным (16-байтом) из-за ограничений платформы CryptoKit.

Ключи ChaCha20Poly1305, одноразовые числа и теги аутентификации

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

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

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

RSA

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

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

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

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

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

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

RSA в Windows

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

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

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

Тип Виндоус Линукс macOS iOS, tvOS, MacCatalyst Андроид
RSACryptoServiceProvider ✔️ ⚠️1 ⚠️1 ⚠️1 ⚠️1
RSACng ✔️
RSAOpenSsl ✔️ 2

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

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

ECDSA

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

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

эллиптическая кривая; Windows 10 Windows 7 — 8.1 Линукс macOS iOS, tvOS, MacCatalyst Андроид
NIST P-256 (secp256r1) ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
NIST P-384 (secp384r1) ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
NIST P-521 (secp521r1) ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Кривые Brainpool (именованные кривые) ✔️ ⚠️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. Используемые типы не преобразуются между платформами и должны использоваться только непосредственно при необходимости.

Тип Виндоус Линукс macOS iOS, tvOS, MacCatalyst Андроид
ECDsaCng ✔️
ECDsaOpenSsl ✔️ ❌*

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

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)

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

эллиптическая кривая; Windows 10+ Windows 7 — 8.1 Линукс macOS iOS, tvOS, MacCatalyst Андроид
NIST P-256 (secp256r1) ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
NIST P-384 (secp384r1) ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
NIST P-521 (secp521r1) ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Кривые Brainpool (именованные кривые) ✔️ ⚠️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. Используемые типы не преобразуются между платформами и должны использоваться только непосредственно при необходимости.

Тип Виндоус Линукс macOS iOS, tvOS, MacCatalyst Андроид
ECDiffieHellmanCng ✔️
ECDiffieHellmanOpenSsl ✔️ ❌*

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

DSA

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

Функция Windows CNG Линукс macOS Windows CAPI (Криптографический интерфейс программирования для Windows) iOS, tvOS, MacCatalyst Андроид
Создание ключа (<= 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 (CNG) используется всякий раз, когда используется new DSACng().
  • Объект, возвращаемый DSA.Create, внутренне поддерживается Windows CNG. Это использование Windows CNG является деталью реализации и может быть изменено.
  • Метод GetDSAPublicKey расширения для X509Certificate2 возвращает экземпляр DSACng. Это использование DSACng является подробным описанием реализации и подлежит изменению.
  • Метод расширения GetDSAPrivateKey для X509Certificate2 предпочитает экземпляр DSACng, но если DSACng не удается открыть ключ, будет предпринята попытка с DSACryptoServiceProvider. Предпочитаемый провайдер является деталью реализации и подлежит изменению.

Нативное взаимодействие DSA

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

Тип Виндоус Линукс macOS iOS, tvOS, MacCatalyst Андроид
DSACryptoServiceProvider ✔️ ⚠️1 ⚠️1 ⚠️1
DSACng ✔️
DSAOpenSsl ✔️ 2

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

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

После квантовой криптографии

Постквантовые алгоритмы доступны начиная с .NET 10. Они также доступны для .NET Framework с помощью пакета NuGet Microsoft.Bcl.Cryptography. В следующей таблице поддержки указывается поддержка платформы встроенных компонентов шифрования операционной системы, например созданных из Generate или ImportFromPem. Реализации, производные от базового класса, могут иметь разные характеристики поддержки.

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

Собственные типы взаимодействия для алгоритмов post-quantum не поддерживают создание ключей или импорт. Они существуют специально для сценариев взаимодействия с собственными типами платформ, такими как EVP_PKEY OpenSSL или CngKey Windows.

ML-KEM

Алгоритм Виндоус Линукс Яблоко Андроид Браузер
ML-KEM-512 Инсайдерская программа Windows 11 (последняя сборка) OpenSSL 3.5.0+
ML-KEM-768 Инсайдерская программа Windows 11 (последняя сборка) OpenSSL 3.5.0+
ML-KEM-1024 Инсайдерская программа Windows 11 (последняя сборка) OpenSSL 3.5.0+

Нативная интероперабельность ML-KEM

  • MLKemOpenSsl: OpenSSL 3.5.0+
  • MLKemCng: Участники программы Windows 11 Insider (Последняя сборка)

ML-DSA

ML-DSA имеет чистый и предхешированный вариант (HashML-DSA). В следующей таблице указаны как оригинальные, так и прехэшированные варианты.

Алгоритм Виндоус Линукс Яблоко Андроид Браузер
ML-DSA-44 Инсайдерская программа Windows 11 (последняя сборка) OpenSSL 3.5.0+
ML-DSA-65 Инсайдерская программа Windows 11 (последняя сборка) OpenSSL 3.5.0+
ML-DSA-87 Инсайдерская программа Windows 11 (последняя сборка) OpenSSL 3.5.0+
ML-DSA-44 External Mu (μ)1 OpenSSL 3.5.0+
ML-DSA-65 External Mu (μ)1 OpenSSL 3.5.0+
ML-DSA-87 External Mu (μ)1 OpenSSL 3.5.0+

1 Поддержка внешнего Mu предназначена для подписывания и проверки только Mu. Вычисление Mu не поддерживается.

Нативная межоперабельность ML-DSA

  • MLDsaOpenSsl: OpenSSL 3.5.0+
  • MLDsaCng: Участники программы Windows 11 Insider (новейшая версия)

SLH-DSA

SLH-DSA имеет основной и предхешируемый варианты (HashSLH-DSA). В следующей таблице указаны как оригинальные, так и прехэшированные варианты.

Алгоритм Виндоус Линукс Яблоко Андроид Браузер
SLH-DSA-SHA2-128f OpenSSL 3.5.0+
SLH-DSA-SHA2-128s OpenSSL 3.5.0+
SLH-DSA-SHA2-192f OpenSSL 3.5.0+
SLH-DSA-SHA2-192s OpenSSL 3.5.0+
SLH-DSA-SHA2-256f OpenSSL 3.5.0+
SLH-DSA-SHA2-256s OpenSSL 3.5.0+
SLH-DSA-SHAKE-128f OpenSSL 3.5.0+
SLH-DSA-SHAKE-128s OpenSSL 3.5.0+
SLH-DSA-SHAKE-192f OpenSSL 3.5.0+
SLH-DSA-SHAKE-192s OpenSSL 3.5.0+
SLH-DSA-SHAKE-256f OpenSSL 3.5.0+
SLH-DSA-SHAKE-256s OpenSSL 3.5.0+

Встроенная совместимость SLH-DSA

Составные ML-DSA

Алгоритм Виндоус Линукс Яблоко Андроид Браузер
MLDSA44-RSA2048-PSS-SHA256 Инсайдерская программа Windows 11 (последняя сборка) OpenSSL 3.5.0+
MLDSA44-RSA2048-PKCS15-SHA256 Инсайдерская программа Windows 11 (последняя сборка) OpenSSL 3.5.0+
MLDSA44-Ed25519-SHA512
MLDSA44-ECDSA-P256-SHA256 Инсайдерская программа Windows 11 (последняя сборка) OpenSSL 3.5.0+
MLDSA65-RSA3072-PSS-SHA512 Инсайдерская программа Windows 11 (последняя сборка) OpenSSL 3.5.0+
MLDSA65-RSA3072-PKCS15-SHA512 Инсайдерская программа Windows 11 (последняя сборка) OpenSSL 3.5.0+
MLDSA65-RSA4096-PSS-SHA512 Инсайдерская программа Windows 11 (последняя сборка) OpenSSL 3.5.0+
MLDSA65-RSA4096-PKCS15-SHA512 Инсайдерская программа Windows 11 (последняя сборка) OpenSSL 3.5.0+
MLDSA65-ECDSA-P256-SHA512 Инсайдерская программа Windows 11 (последняя сборка) OpenSSL 3.5.0+
MLDSA65-ECDSA-P384-SHA512 Инсайдерская программа Windows 11 (последняя сборка) OpenSSL 3.5.0+
MLDSA65-ECDSA-brainpoolP256r1-SHA512 Инсайдерская программа Windows 11 (последняя сборка) OpenSSL 3.5.0+
MLDSA65-Ed25519-SHA512
MLDSA87-ECDSA-P384-SHA512 Инсайдерская программа Windows 11 (последняя сборка) OpenSSL 3.5.0+
MLDSA87-ECDSA-brainpoolP384r1-SHA512 Инсайдерская программа Windows 11 (последняя сборка) OpenSSL 3.5.0+
MLDSA87-Ed448-SHAKE256
MLDSA87-RSA3072-PSS-SHA512 Инсайдерская программа Windows 11 (последняя сборка) OpenSSL 3.5.0+
MLDSA87-RSA4096-PSS-SHA512 Инсайдерская программа Windows 11 (последняя сборка) OpenSSL 3.5.0+
MLDSA87-ECDSA-P521-SHA512 Инсайдерская программа Windows 11 (последняя сборка) OpenSSL 3.5.0+

Композитное взаимодействие ML-DSA

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

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

Чтение PKCS12/PFX

Сценарий Виндоус Линукс macOS iOS, tvOS, MacCatalyst Андроид
Пустой ✔️ ✔️ ✔️ ✔️ ✔️
Один сертификат, без закрытого ключа ✔️ ✔️ ✔️ ✔️ ✔️
Один сертификат с закрытым ключом ✔️ ✔️ ✔️ ✔️ ✔️
Несколько сертификатов, закрытых ключей нет ✔️ ✔️ ✔️ ✔️ ✔️
Несколько сертификатов, один закрытый ключ ✔️ ✔️ ✔️ ✔️ ✔️
Несколько сертификатов, несколько закрытых ключей ✔️ ✔️ ✔️ ✔️ ✔️

Создать PKCS12/PFX

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

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

Создание коллекции сертификатов PKCS7

Windows и Linux выдают большие двоичные объекты PKCS7 с кодировкой DER. macOS выдает двоичные объекты PKCS #7, кодированные в CER с неопределенной длиной.

X509Store

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

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

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

Мой магазин

Сценарий Виндоус Линукс macOS iOS, tvOS, MacCatalyst Андроид
Откройте CurrentUser\My (только для чтения) ✔️ ✔️ ✔️ ✔️ ✔️
Откройте CurrentUser\My (ReadWrite) ✔️ ✔️ ✔️ ✔️ ✔️
Откройте CurrentUser\My (ExistingOnly) ✔️ ⚠️ ✔️ ✔️ ✔️
Откройте LocalMachine\My ✔️ ✔️ ✔️ ✔️

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

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

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

Сценарий Виндоус Линукс macOS iOS, tvOS, MacCatalyst Андроид
Откройте 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 результатов для доменов доверия администратора и системы.

Расположения доверенных корневых сертификатов в Linux

В Linux .NET использует OpenSSL (libssl) для поиска доверенных корневых сертификатов. OpenSSL определяет расположение хранилища сертификатов с помощью переменных среды (SSL_CERT_FILE и SSL_CERT_DIR) и путей по умолчанию для конкретного дистрибутива. Если каталог корневого хранилища, настроенный для OpenSSL, не содержит никаких сертификатов, .NET возвращается к проверке /etc/ssl/certs. Эта резервная версия обеспечивает совместимость с дистрибутивами, такими как SUSE Linux Enterprise Server (SLES), где указанный в SSL_CERT_DIR каталог может содержать только сертификаты в формате BEGIN TRUSTED CERTIFICATE, который .NET не поддерживает в качестве корневых сертификатов.

Этот резервный вариант возникает только в следующих случаях:

  1. Переменная SSL_CERT_DIR среды не задана явным образом.
  2. Каталог сертификатов по умолчанию не содержит доступных сертификатов.

Если ваши сертификаты не загружаются правильно, убедитесь, что:

  • Файлы сертификатов находятся в формате PEM с маркером BEGIN CERTIFICATE (не BEGIN TRUSTED CERTIFICATE).
  • Переменные среды SSL_CERT_DIR и SSL_CERT_FILE указывают на правильные расположения, если заданы.
  • Файл пакета сертификатов или каталог имеет соответствующие разрешения на чтение.

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

Сценарий Виндоус Линукс macOS iOS, tvOS, MacCatalyst Андроид
Откройте 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.

Запрещенный магазин

Сценарий Виндоус Линукс macOS iOS, tvOS, MacCatalyst Андроид
Откройте 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 являются интерпретациями соответствующих результатов SecTrustSettings для сертификатов, для которых задано значение доверия Always Deny.

Не существующий магазин

Сценарий Виндоус Линукс macOS iOS, tvOS, MacCatalyst Андроид
Откройте несуществующий магазин (ExistingOnly)
Открыть несуществующее хранилище CurrentUser (чтение/запись) ✔️ ✔️ ⚠️
Открытие несуществующего хранилища LocalMachine (ReadWrite) ✔️

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

X509Chain

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

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

Сертификаты шифрования после квантовых вычислений и PKCS12/PFX

Поддержка постквантовых сертификатов также требует поддержки от примитивного алгоритма.

Операция Алгоритм Виндоус Линукс Яблоко Андроид Браузер
Импорт PKCS#12 ML-DSA ✔️ ✔️
Экспорт PKCS#12 ML-DSA ✔️ ✔️
Ассоциация закрытого ключа ML-DSA ✔️ ✔️
 
Импорт PKCS#12 ML-KEM ✔️
Экспорт PKCS#12 ML-KEM ✔️
Ассоциация закрытого ключа ML-KEM ✔️
 
Импорт PKCS#12 SLH-DSA ✔️
Экспорт PKCS#12 SLH-DSA ✔️
Ассоциация закрытого ключа SLH-DSA ✔️

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