次の方法で共有


.NET でのクロスプラットフォーム暗号化

.NET での暗号化操作は、オペレーティング システム (OS) ライブラリによって行われます。 この依存関係には、次の利点があります。

  • .NET アプリが、信頼できる OS の恩恵を受けられます。 OS ベンダーにとって、暗号化ライブラリを脆弱性から保護することは高い優先順位です。 そのために、システム管理者が適用する必要がある更新プログラムを提供しています。
  • OS ライブラリが FIPS 検証済みの場合、.NET アプリから FIPS 検証アルゴリズムにアクセスできます。

OS ライブラリに依存するということは、.NET アプリから、OS でサポートされる暗号化機能のみを使用できるということも意味します。 特定のコア機能がすべてのプラットフォームによってサポートされているのに対して、.NET によってサポートされている一部の機能は一部のプラットフォームで使用できません。 この記事では、各プラットフォームでサポートされている機能について説明します。

この記事では、.NET での暗号化に精通していることを前提としています。 詳細については、「.NET 暗号化モデル」と「.NET 暗号化サービス」を参照してください。

ハッシュとメッセージ認証アルゴリズム

*Managed クラスを含むすべてのハッシュ アルゴリズムとハッシュベースのメッセージ認証 (HMAC) クラスは、OS ライブラリに従います。ただし、Browser WASM の .NETは例外です。 ブラウザ WASM では、SHA-1、SHA-2-256、SHA-2-384、SHA-2-512、および HMAC と同等のものがマネージド コードを使用して実装されています。

アルゴリズム ウィンドウズ Linux macOS iOS、tvOS、MacCatalyst Android ブラウザー
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 ビルド 26016 以降 OpenSSL 3.0 以降
KMAC-2561 Windows 11 ビルド 26016 以降 OpenSSL 3.0 以降
KMAC-XOF-1281 Windows 11 ビルド 26016 以降 OpenSSL 3.0 以降
KMAC-XOF-2561 Windows 11 ビルド 26016 以降 OpenSSL 3.0 以降

1.NET 9 以降で使用できます。

2.NET 9 以降では、拡張出力関数 (XOF) のストリーミングを使用できます。 Linux では、OpenSSL 3.3 が必要です。

対称暗号化

基になる暗号とチェーンは、システム ライブラリによって処理されます。

暗号 + モード ウィンドウズ 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.AesGcmSystem.Security.Cryptography.ChaCha20Poly1305 クラスで提供されます。

認証された暗号化では、アルゴリズムをサポートするために新しいプラットフォーム API が必要であるため、サポートがすべてのプラットフォームに存在しない可能性があります。 現在のプラットフォームがアルゴリズムをサポートしているかどうかを実行時に検出するには、アルゴリズムのクラスで IsSupported 静的プロパティを使用できます。

暗号 + モード ウィンドウズ Linux macOS iOS、tvOS、MacCatalyst Android ブラウザー
AES-GCM ✔️ ✔️ ✔️ ⚠️ ✔️
AES-CCM ✔️ ✔️ ✔️
ChaCha20Poly1305 Windows 10 ビルド 20142 以降 OpenSSL 1.1.0 以降 ✔️ ⚠️ API レベル 28 以降

macOS での AES-CCM

.NET 10 より前 AES-CCM、サポートされているバージョンの OpenSSL が存在し、動的ライブラリ ローダーがそれを見つける可能性がある場合に機能していました。 .NET 10 では、macOS での OpenSSL のサポートが削除されました。

iOS、tvOS、MacCatalyst 上の AES-GCM と ChaCha20Poly1305

AES-GCM と ChaCha20Poly1305 のサポートは、iOS および tvOS 13.0 以降の .NET 9 以降、およびすべてのバージョンの MacCatalyst で利用できます。

AES-CCM のキー、ナンス、タグ

  • キーのサイズ

    AES-CCM には 128、192、および 256 ビット キーを使用します。

  • nonce のサイズ

    AesCcm クラスにより、56、64、72、80、88、96、および 104 ビット (7、8、9、10、11、12、および 13 バイト) nonce がサポートされています。

  • タグのサイズ

    AesCcm クラスにより、32、48、64、80、96、112、および 128 ビット (4、8、10、12、14、および 16 バイト) タグの作成または処理がサポートされています。

AES-GCM のキー、ノンス、タグ

  • キーのサイズ

    AES-GCM には 128、192、および 256 ビット キーを使用します。

  • nonce のサイズ

    AesGcm クラスにより、96 ビット (12 バイト) の nonce のみがサポートされています。

  • タグのサイズ

    Windows および Linux では、 AesGcm クラスは、96、104、112、120、および 128 ビット (12、13、14、15、および 16 バイト) のタグの作成または処理をサポートします。 Apple プラットフォームでは、CryptoKit フレームワークの制限により、タグのサイズは 128 ビット (16 バイト) に制限されます。

ChaCha20Poly1305キー、ナンス、およびタグ

ChaCha20Poly1305 のキー、nonce、認証タグは固定サイズです。 ChaCha20Poly1305 では、常に 256 ビットのキー、96 ビット (12 バイト) の nonce、128 ビット (16 バイト) のタグが使用されます。

非対称暗号化

このセクションには、次のサブセクションが含まれています。

RSA

RSA (Rivest–Shamir–Adleman) のキー生成は OS ライブラリによって実行され、そのサイズの制限とパフォーマンス特性が適用されます。

RSA のキー操作は OS ライブラリによって実行され、読み込むことができるキーの種類は OS 要件に従います。

.NET では、"生" の (パディングされていない) RSA 操作は公開されていません。

パディングとダイジェストのサポートは、プラットフォームによって異なります。

パディング モード Windows (CNG) Linux (OpenSSL) macOS iOS、tvOS、MacCatalyst Android 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) は、SHA-2 アルゴリズムを使用した PKCS1 署名が可能です。 ただし、個々の RSA オブジェクトが、それをサポートしていない暗号化サービス プロバイダー (CSP) に読み込まれる場合があります。

Windows 上の RSA

  • new RSACryptoServiceProvider() が使用されるたびに、Windows CryptoAPI (CAPI) が使用されます。
  • new RSACng() が使用されるたびに、Windows Cryptography API Next Generation (CNG) が使用されます。
  • RSA.Create から返されるオブジェクトは、内部的には Windows CNG が動作します。 この Windows CNG の使用は実装の 1 項目であり、変更される可能性があります。
  • GetRSAPublicKeyX509Certificate2 拡張メソッドから、 RSACng インスタンスが返されます。 この RSACng の使用は実装の 1 項目であり、変更される可能性があります。
  • GetRSAPrivateKeyX509Certificate2 拡張メソッドでは現在 RSACng インスタンスが優先されますが、 RSACng がキーを開けない場合は、 RSACryptoServiceProvider が試行されます。 優先プロバイダーは実装の 1 項目であり、変更される可能性があります。

RSA のネイティブな相互運用性

.NET 暗号化コードによって使用される OS ライブラリとの相互運用をプログラムで可能にする種類が .NET によって公開されています。 関連する種類はプラットフォーム間で変換されないため、必要な場合にのみ直接使用する必要があります。

タイプ ウィンドウズ Linux macOS iOS、tvOS、MacCatalyst Android
RSACryptoServiceProvider ✔️ ⚠️1 ⚠️1 ⚠️1 ⚠️1
RSACng ✔️
RSAOpenSsl ✔️ 2

1 Windows 以外では、既存のプログラムとの互換性のために RSACryptoServiceProvider を使用できます。 この場合、名前付きキーを開くなど、OS の相互運用を必要とするメソッドから PlatformNotSupportedException がスローされます。

2 macOS では、.NET 10 より前のバージョンでは、OpenSSL がインストールされていて、動的ライブラリの読み込みによって適切な libcrypto dylib が見つかった場合は、 RSAOpenSsl が機能していました。 このサポートは .NET 10 で削除されました。

ECDSA

ECDSA (楕円曲線デジタル署名アルゴリズム) のキー生成は OS ライブラリによって行われ、そのサイズの制限とパフォーマンス特性が適用されます。

ECDSA のキー曲線は OS ライブラリによって定義され、その制限が適用されます。

楕円曲線 ウィンドウズ10 Windows 7 から 8.1 Linux macOS iOS、tvOS、MacCatalyst Android
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 10 の Windows CNG に追加されました。 詳細については、 CNG 名前付き楕円曲線に関する記事をご覧ください。 名前付き曲線は、Windows 7 における 3 つの曲線を除き、以前のバージョンの Windows では使用できません。

3 明示的な曲線パラメーターを使用してエクスポートするには、OS ライブラリのサポートが必須です。これは、Apple のプラットフォームまたは以前のバージョンの Windows では使用できません。

4 一部の曲線に対する Android のサポートは、Android のバージョンによって異なります。 Android のディストリビューターによって、Android ビルドから曲線が追加または削除される場合があります。

ECDSA のネイティブな相互運用性

.NET 暗号化コードによって使用される OS ライブラリとの相互運用をプログラムで可能にする種類が .NET によって公開されています。 関連する種類はプラットフォーム間で変換されないため、必要な場合にのみ直接使用する必要があります。

タイプ ウィンドウズ Linux macOS iOS、tvOS、MacCatalyst Android
ECDsaCng ✔️
ECDsaOpenSsl ✔️ ❌*

* macOS では、.NET 10 より前のバージョンでは、OpenSSL がインストールされていて、動的ライブラリの読み込みによって適切な libcrypto dylib が見つかった場合は、 ECDsaOpenSsl が機能していました。 このサポートは .NET 10 で削除されました。

ECDH

ECDH (Elliptic Curve Diffie-Hellman) のキー生成は OS ライブラリによって行われ、そのサイズの制限とパフォーマンス特性が適用されます。

ECDiffieHellman クラスでは、ECDH 計算の "生の" 値と、次のキー派生関数がサポートされます。

  • HASH(Z)
  • HASH(先頭追加 || Z || 末尾追加)
  • HMAC(key, Z)
  • HMAC(key, prepend ||Z ||append)
  • HMAC(Z, Z)
  • HMAC(Z, prepend ||Z ||append)
  • Tls11Prf(label, seed)

ECDH のキー曲線は OS ライブラリによって定義され、その制限が適用されます。

楕円曲線 Windows 10 以降 Windows 7 から 8.1 Linux macOS iOS、tvOS、MacCatalyst Android
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 10 の Windows CNG に追加されました。 詳細については、 CNG 名前付き楕円曲線に関する記事をご覧ください。 名前付き曲線は、Windows 7 における 3 つの曲線を除き、以前のバージョンの Windows では使用できません。

3 明示的な曲線パラメーターを使用してエクスポートするには、OS ライブラリのサポートが必須です。これは、Apple のプラットフォームまたは以前のバージョンの Windows では使用できません。

4 一部の曲線に対する Android のサポートは、Android のバージョンによって異なります。 Android のディストリビューターによって、Android ビルドから曲線が追加または削除される場合があります。

ECDH のネイティブな相互運用

.NET によって使用される OS ライブラリとの相互運用をプログラムで可能にする種類が .NET によって公開されています。 関連する種類はプラットフォーム間で変換されないため、必要な場合にのみ直接使用する必要があります。

タイプ ウィンドウズ Linux macOS iOS、tvOS、MacCatalyst Android
ECDiffieHellmanCng ✔️
ECDiffieHellmanOpenSsl ✔️ ❌*

* macOS では、.NET 10 より前のバージョンでは、OpenSSL がインストールされていて、動的ライブラリの読み込みによって適切な libcrypto dylib が見つかった場合は、 ECDiffieHellmanOpenSsl が機能していました。 このサポートは .NET 10 で削除されました。

DSA

DSA (デジタル署名アルゴリズム) のキー生成はシステム ライブラリによって実行され、そのサイズの制限とパフォーマンス特性が適用されます。

機能 Windows CNG Linux macOS Windows CAPI (Windowsの暗号化API) iOS、tvOS、MacCatalyst Android
キーの作成 (<= 1024 ビット) ✔️ ✔️ ✔️ ✔️
キーの作成 (> 1024 ビット) ✔️ ✔️ ✔️
キーの読み込み (<= 1024 ビット) ✔️ ✔️ ✔️ ✔️ ✔️
キーの読み込み (> 1024 ビット) ✔️ ✔️ ⚠️* ✔️
FIPS 186-2 ✔️ ✔️ ✔️ ✔️ ✔️
FIPS 186-3 (SHA-2 署名) ✔️ ✔️ ✔️

* 1024 ビットより大きい DSA キーは、macOS によって読み込まれますが、これらのキーの動作は定義されていません。 FIPS 186-3 に従って動作しません。

Windows 上の DSA

  • new DSACryptoServiceProvider() が使用されるたびに、Windows CryptoAPI (CAPI) が使用されます。
  • new DSACng() が使用されるたびに、Windows Cryptography API Next Generation (CNG) が使用されます。
  • DSA.Create から返されるオブジェクトは、内部的には Windows CNG が動作します。 この Windows CNG の使用は実装の 1 項目であり、変更される可能性があります。
  • GetDSAPublicKeyX509Certificate2 拡張メソッドから、 DSACng インスタンスが返されます。 この DSACng の使用は実装の 1 項目であり、変更される可能性があります。
  • GetDSAPrivateKeyX509Certificate2 拡張メソッドでは DSACng インスタンスが優先されますが、 DSACng がキーを開けない場合は、 DSACryptoServiceProvider が試行されます。 優先プロバイダーは実装の 1 項目であり、変更される可能性があります。

DSA のネイティブな相互運用

.NET 暗号化コードによって使用される OS ライブラリとの相互運用をプログラムで可能にする種類が .NET によって公開されています。 関連する種類はプラットフォーム間で変換されないため、必要な場合にのみ直接使用する必要があります。

タイプ ウィンドウズ Linux macOS iOS、tvOS、MacCatalyst Android
DSACryptoServiceProvider ✔️ ⚠️1 ⚠️1 ⚠️1
DSACng ✔️
DSAOpenSsl ✔️ 2

1 Windows 以外では、既存のプログラムとの互換性のために DSACryptoServiceProvider を使用できます。 この場合、システムとの相互運用を必要とする、例えば名前付きキーを開くようなメソッドからPlatformNotSupportedExceptionがスローされます。

2 macOS では、.NET 10 より前のバージョンでは、OpenSSL がインストールされていて、動的ライブラリの読み込みによって適切な libcrypto dylib が見つかった場合は、 DSAOpenSsl が機能していました。 このサポートは .NET 10 で削除されました。

量子後暗号化

.NET 10 以降では、ポスト量子アルゴリズムを使用できます。 Microsoft.Bcl.Cryptography NuGet パッケージを使用する .NET Framework でも使用できます。 次のサポート 表は、 Generate または ImportFromPemから作成されたものなど、組み込みのオペレーティング システム暗号化コンポーネントに対するプラットフォームのサポートを示しています。 基底クラスから派生する実装では、サポート動作が異なる場合があります。

組み込みアルゴリズムの場合、プラットフォームがパラメーター セットのいずれかをサポートしているかどうかを判断するために、 IsSupported 静的プロパティを使用できます。

ポスト量子アルゴリズムのネイティブ相互運用機能の種類では、キーの生成やインポートはサポートされていません。 これらは、OpenSSL 上の EVP_PKEY や Windows 上の CngKey など、ネイティブ プラットフォームの種類との相互運用シナリオ専用に存在します。

ML-KEM

アルゴリズム ウィンドウズ Linux 林檎 Android ブラウザー
ML-KEM-512 Windows 11 Insider (最新) OpenSSL 3.5.0 以降
ML-KEM-768 Windows 11 Insider (最新) OpenSSL 3.5.0 以降
ML-KEM-1024 Windows 11 Insider (最新) OpenSSL 3.5.0 以降

ネイティブ相互運用性 ML-KEM

ML-DSA

ML-DSA には純粋でプレハッシュのバリアント (HashML-DSA) があります。 次の表は、純粋バリアントとプレハッシュバリアントの両方を反映しています。

アルゴリズム ウィンドウズ Linux 林檎 Android ブラウザー
ML-DSA-44 Windows 11 Insider (最新) OpenSSL 3.5.0 以降
ML-DSA-65 Windows 11 Insider (最新) OpenSSL 3.5.0 以降
ML-DSA-87 Windows 11 Insider (最新) OpenSSL 3.5.0 以降
ML-DSA-44 外部 Mu (μ)1 OpenSSL 3.5.0 以降
ML-DSA-65 外部 Mu (μ)1 OpenSSL 3.5.0 以降
ML-DSA-87 外部 Mu (μ)1 OpenSSL 3.5.0 以降

1 外部 Mu のサポートは、Mu の署名と検証のみを目的としています。 Mu の計算はサポートされていません。

ネイティブインターロップ ML-DSA

SLH-DSA

SLH-DSA には純粋でプレハッシュのバリアント (HashSLH-DSA) があります。 次の表は、純粋バリアントとプレハッシュバリアントの両方を反映しています。

アルゴリズム ウィンドウズ Linux 林檎 Android ブラウザー
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

アルゴリズム ウィンドウズ Linux 林檎 Android ブラウザー
MLDSA44-RSA2048-PSS-SHA256 Windows 11 Insider (最新) OpenSSL 3.5.0 以降
MLDSA44-RSA2048-PKCS15-SHA256 Windows 11 Insider (最新) OpenSSL 3.5.0 以降
MLDSA44-Ed25519-SHA512
MLDSA44-ECDSA-P256-SHA256 Windows 11 Insider (最新) OpenSSL 3.5.0 以降
MLDSA65-RSA3072-PSS-SHA512 Windows 11 Insider (最新) OpenSSL 3.5.0 以降
MLDSA65-RSA3072-PKCS15-SHA512 Windows 11 Insider (最新) OpenSSL 3.5.0 以降
MLDSA65-RSA4096-PSS-SHA512 Windows 11 Insider (最新) OpenSSL 3.5.0 以降
MLDSA65-RSA4096-PKCS15-SHA512 Windows 11 Insider (最新) OpenSSL 3.5.0 以降
MLDSA65-ECDSA-P256-SHA512 Windows 11 Insider (最新) OpenSSL 3.5.0 以降
MLDSA65-ECDSA-P384-SHA512 Windows 11 Insider (最新) OpenSSL 3.5.0 以降
MLDSA65-ECDSA-brainpoolP256r1-SHA512 Windows 11 Insider (最新) OpenSSL 3.5.0 以降
MLDSA65-Ed25519-SHA512
MLDSA87-ECDSA-P384-SHA512 Windows 11 Insider (最新) OpenSSL 3.5.0 以降
MLDSA87-ECDSA-brainpoolP384r1-SHA512 Windows 11 Insider (最新) OpenSSL 3.5.0 以降
MLDSA87-Ed448-SHAKE256
MLDSA87-RSA3072-PSS-SHA512 Windows 11 Insider (最新) OpenSSL 3.5.0 以降
MLDSA87-RSA4096-PSS-SHA512 Windows 11 Insider (最新) OpenSSL 3.5.0 以降
MLDSA87-ECDSA-P521-SHA512 Windows 11 Insider (最新) OpenSSL 3.5.0 以降

ネイティブ相互運用複合 ML-DSA

X.509 証明書

.NET での X.509 証明書のサポートの大部分は、OS ライブラリから提供されます。 証明書を .NET の X509Certificate2 または X509Certificate インスタンスに読み込むには、証明書が、基盤となる OS ライブラリによって読み込まれる必要があります。

PKCS12/PFX を読み取る

シナリオ ウィンドウズ Linux macOS iOS、tvOS、MacCatalyst Android
空っぽ ✔️ ✔️ ✔️ ✔️ ✔️
証明書が 1 つ、秘密キーなし ✔️ ✔️ ✔️ ✔️ ✔️
証明書が 1 つ、秘密キーあり ✔️ ✔️ ✔️ ✔️ ✔️
証明書が複数、秘密キーなし ✔️ ✔️ ✔️ ✔️ ✔️
証明書が複数、秘密キーが 1 つ ✔️ ✔️ ✔️ ✔️ ✔️
証明書が複数、秘密キーが複数 ✔️ ✔️ ✔️ ✔️ ✔️

PKCS12/PFX を書き込む

シナリオ ウィンドウズ Linux macOS iOS、tvOS、MacCatalyst Android
空っぽ ✔️ ✔️ ✔️ ✔️ ✔️
証明書が 1 つ、秘密キーなし ✔️ ✔️ ✔️ ✔️ ✔️
証明書が 1 つ、秘密キーあり ✔️ ✔️ ✔️ ✔️ ✔️
証明書が複数、秘密キーなし ✔️ ✔️ ✔️ ✔️ ✔️
証明書が複数、秘密キーが 1 つ ✔️ ✔️ ✔️ ✔️ ✔️
証明書が複数、秘密キーが複数 ✔️ ✔️ ✔️ ✔️ ✔️
一時的な読み込み ✔️ ✔️ ✔️ ✔️

macOS では、キーチェーン オブジェクトがないと、ディスクへの書き込みが必要な秘密キーを読み込むことができません。 キーチェーンは PFX 読み込み用に自動的に作成され、使用されなくなると削除されます。 X509KeyStorageFlags.EphemeralKeySet オプションは、秘密キーがディスクに書き込まれてはいけないことを意味するため、macOS でそのフラグをアサートすると PlatformNotSupportedException が発生します。

PKCS7 証明書コレクションを書き込む

Windows と Linux では両方とも DER エンコードされた PKCS7 BLOB が生成されます。 macOS では、長さが不定の CER エンコードされた PKCS7 BLOB が生成されます。

X509Store

Windows では、 X509Store クラスは Windows 証明書ストア API を表します。 これらの API は、.NET Framework と同じように .NET で動作します。

Windows 以外では、 X509Store クラスは、システムの信頼の決定 (読み取り専用)、ユーザー信頼の決定 (読み取り/書き込み)、ユーザー キー ストレージ (読み取り/書き込み) のプロジェクションです。

次の表は、各プラットフォームでサポートされているシナリオを示しています。 サポートされていないシナリオ (表の❌) の場合、 CryptographicException がスローされます。

私のストア

シナリオ ウィンドウズ Linux macOS iOS、tvOS、MacCatalyst Android
CurrentUser\My を開く (ReadOnly) ✔️ ✔️ ✔️ ✔️ ✔️
CurrentUser\My を開く (ReadWrite) ✔️ ✔️ ✔️ ✔️ ✔️
CurrentUser\My を開く (ExistingOnly) ✔️ ⚠️ ✔️ ✔️ ✔️
LocalMachine\My を開く ✔️ ✔️ ✔️ ✔️

Linux では、最初の書き込み時にストアが作成され、既定ではユーザー ストアが存在しないため、 CurrentUser\MyExistingOnly で開くとエラーになるおそれがあります。

macOS では、 CurrentUser\My ストアがユーザーの既定のキーチェーンであり、既定では login.keychain です。 LocalMachine\My ストアは System.keychain です。

ルート ストア

シナリオ ウィンドウズ 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 の既定のパス内にある CA バンドルを解釈したものです。

macOS では、 CurrentUser\Root ストアは、ユーザー信頼ドメインの SecTrustSettings の結果を解釈したものです。 LocalMachine\Root ストアは、管理者およびシステム信頼ドメインの SecTrustSettings の結果を解釈したものです。

Linux での信頼されたルート証明書の場所

Linux では、.NET は OpenSSL (libssl) を使用して信頼されたルート証明書を見つけます。 OpenSSL は、環境変数 (SSL_CERT_FILESSL_CERT_DIR) と配布固有の既定のパスを使用して、証明書ストアの場所を決定します。 OpenSSL 用に構成されたルート ストア ディレクトリに証明書が含まれていない場合、.NET は /etc/ssl/certsのチェックにフォールバックします。 このフォールバックにより、SUSE Linux Enterprise Server (SLES) などのディストリビューションとの互換性が確保されます。 SSL_CERT_DIR で指定されたディレクトリには、ルート証明書としてサポートされていない BEGIN TRUSTED CERTIFICATE 形式の証明書のみが含まれている可能性があります。

このフォールバックは、次の場合にのみ発生します。

  1. SSL_CERT_DIR環境変数は明示的に設定されていません。
  2. 既定の証明書ディレクトリには、使用可能な証明書が含まれていません。

証明書が正しく読み込まれていない場合は、次のことを確認します。

  • 証明書ファイルは、(BEGIN CERTIFICATEではなく) BEGIN TRUSTED CERTIFICATE マーカーを含む PEM 形式です。
  • SSL_CERT_DIR環境変数とSSL_CERT_FILE環境変数は、正しい場所 (設定されている場合) を指します。
  • 証明書バンドル ファイルまたはディレクトリには、適切な読み取りアクセス許可があります。

中間ストア

シナリオ ウィンドウズ 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 ビルドが成功したときに、その機関情報アクセス レコードによって中間 CA をダウンロードする際のキャッシュとして使用されます。 LocalMachine\Intermediate ストアは、OpenSSL の既定のパス内にある CA バンドルを解釈したものです。

macOS では、 CurrentUser\Intermediate ストアはカスタム ストアとして扱われます。 このストアに追加された証明書は、X.509 チェーンの構築には影響しません。

許可されないストア

シナリオ ウィンドウズ Linux macOS iOS、tvOS、MacCatalyst Android
CurrentUser\Disallowed を開く (ReadOnly) ✔️ ⚠️ ✔️ ✔️ ✔️
CurrentUser\Disallowed を開く (ReadWrite) ✔️ ⚠️
CurrentUser\Disallowed を開く (ExistingOnly) ✔️ ⚠️ ✔️ (ReadOnly の場合) ✔️ (ReadOnly の場合) ✔️ (ReadOnly の場合)
LocalMachine\Disallowed を開く (読み取り専用) ✔️ ✔️ ✔️ ✔️
LocalMachine\Disallowed を開く (ReadWrite) ✔️
LocalMachine\Disallowed を開く (ExistingOnly) ✔️ ✔️ (ReadOnly の場合) ✔️ (ReadOnly の場合) ✔️ (ReadOnly の場合)

Linux では、 Disallowed ストアはチェーンのビルドでは使用されず、そのストアにコンテンツを追加しようとすると、 CryptographicExceptionが発生します。 コンテンツが既に取得されている場合に CryptographicException ストアを開くと、 Disallowed がスローされます。

macOS では、CurrentUser\Disallowed および LocalMachine\Disallowed ストアは、信頼が Always Deny に設定されている証明書の適切な SecTrustSettings 結果を解釈したものです。

存在しないストア

シナリオ ウィンドウズ Linux macOS iOS、tvOS、MacCatalyst Android
存在しないストアを開く (ExistingOnly)
CurrentUser の存在しないストアを開く (ReadWrite) ✔️ ✔️ ⚠️
LocalMachine の存在しないストアを開く (ReadWrite) ✔️

macOS では、X509Store API を使用したカスタム ストアの作成は、 CurrentUser の場所でのみサポートされています。 これにより、ユーザーのキーチェーン ディレクトリ (~/Library/Keychains) にパスワードなしの新しいキーチェーンが作成されます。 パスワードありのキーチェーンを作成するには、 SecKeychainCreate への P/Invoke を使用できます。 同様に、 SecKeychainOpen を使用して、異なる場所でキーチェーンを開くこともできます。 結果として得られる IntPtrnew X509Store(IntPtr) に渡して、現在のユーザーのアクセス許可に従って、読み取り/書き込み可能なストアを取得できます。

X509Chain(X509証明書チェーン)

オフライン CRL の使用は macOS によりサポートされていないため、 X509RevocationMode.OfflineX509RevocationMode.Onlineとして扱われます。

CRL (証明書失効リスト)/OCSP (オンライン証明書状態プロトコル)/AIA (機関情報アクセス) のダウンロードでユーザーが開始するタイムアウトは macOS によりサポートされていないため、 X509ChainPolicy.UrlRetrievalTimeout は無視されます。

量子後暗号化証明書と PKCS12/PFX

ポスト量子証明書のサポートには、プリミティブ アルゴリズムからのサポートも必要です。

Operation アルゴリズム ウィンドウズ Linux 林檎 Android ブラウザー
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 ✔️

その他のリソース