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

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

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

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

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

ハッシュ アルゴリズム

*Managed クラスを含むすべてのハッシュ アルゴリズムとハッシュベースのメッセージ認証 (HMAC) クラスは、OS ライブラリに従います。ただし、Browser WASM の .NETは例外です。 Browser 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 以降と、OpenSSL 1.1.1 以降の Linux でサポートされています。

対称暗号化

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

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

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

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

macOS での AES-CCM

macOS では、サードパーティのコードに対して AES-CCM がシステム ライブラリによってサポートされていないことから、AesCcm クラスによって OpenSSL がサポートのために使用されています。 macOS のユーザーは、この種類を機能させるために OpenSSL (libcrypto) の適切なコピーを取得する必要があり、それはシステムによって既定でライブラリが読み込まれるパス内にある必要があります。 Homebrew などのパッケージ マネージャーから OpenSSL をインストールすることをお勧めします。

macOS に含まれる libcrypto.0.9.7.dylib および libcrypto.0.9.8.dylib は、以前のバージョンの OpenSSL のライブラリであり、今後は使用されません。 libcrypto.35.dyliblibcrypto.41.dylib、および libcrypto.42.dylib は、LibreSSL のライブラリであり、今後は使用されません。

macOS での AES-GCM と ChaCha20Poly1305

macOS では、macOS 10.15 までサードパーティのコードに対して AES-GCM または ChaCha20Poly1305 がサポートされていませんでした。 .NET 8 より前では、AesGcmChaCha20Poly1305 には AES-CCM と同じ要件があり、これらの種類が機能するためには、ユーザーは OpenSSL をインストールする必要があります。

.NET 8 以降、macOS の .NET では、AES-GCM および ChaCha20Poly1305 に対して Apple の CryptoKit フレームワークが使用されます。 ユーザーは、macOS 上の AES-GCM または ChaCha20Poly1305 用に追加の依存関係をインストールまたは構成する必要はありません。

AES-CCM のキー、nonce、タグ

  • キーのサイズ

    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 のキー、nonce、タグ

  • キーのサイズ

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

  • nonce のサイズ

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

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

ChaCha20Poly1305 キー、nonce、タグ。

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

2 .NET 8 が必要です。

Windows 上の RSA

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

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

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

Type Windows Linux macOS iOS、tvOS、MacCatalyst Android
RSACryptoServiceProvider ✔️ ⚠️1 ⚠️1 ⚠️1 ⚠️1
RSACng ✔️
RSAOpenSsl ✔️ ⚠️2

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

2 macOS では、OpenSSL がインストールされていて、ダイナミック ライブラリを読み込むことで適切な libcrypto dylib を検出できる場合に RSAOpenSsl が機能します。 適切なライブラリを検出できない場合は、例外がスローされます。

ECDSA

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

ECDSA のキー曲線は 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 ビルドから曲線が追加または削除される場合があります。

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

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

Type Windows Linux macOS iOS、tvOS、MacCatalyst Android
ECDsaCng ✔️
ECDsaOpenSsl ✔️ ⚠️*

* macOS では、OpenSSL がシステムにインストールされていて、ダイナミック ライブラリを読み込むことで適切な libcrypto dylib を検出できる場合に ECDsaOpenSsl が機能します。 適切なライブラリを検出できない場合は、例外がスローされます。

ECDH

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

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

  • HASH(Z)
  • HASH(prepend || Z || append)
  • HMAC(key, Z)
  • HMAC(key, prepend || Z || append)
  • HMAC(Z, Z)
  • HMAC(Z, prepend || Z || append)
  • Tls11Prf(label, seed)

"生の" キー派生は .NET 8 で導入されました。

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 によって公開されています。 関連する種類はプラットフォーム間で変換されないため、必要な場合にのみ直接使用する必要があります。

Type Windows Linux macOS iOS、tvOS、MacCatalyst Android
ECDiffieHellmanCng ✔️
ECDiffieHellmanOpenSsl ✔️ ⚠️*

* macOS では、OpenSSL がインストールされていて、ダイナミック ライブラリを読み込むことで適切な libcrypto dylib を検出できる場合に ECDiffieHellmanOpenSsl が機能します。 適切なライブラリを検出できない場合は、例外がスローされます。

DSA

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

機能 Windows CNG Linux macOS Windows CAPI 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 項目であり、変更される可能性があります。
  • X509Certificate2GetDSAPublicKey 拡張メソッドから、DSACng インスタンスが返されます。 この DSACng の使用は実装の 1 項目であり、変更される可能性があります。
  • X509Certificate2GetDSAPrivateKey 拡張メソッドでは DSACng インスタンスが優先されますが、DSACng がキーを開けない場合は、DSACryptoServiceProvider が試行されます。 優先プロバイダーは実装の 1 項目であり、変更される可能性があります。

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

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

Type Windows Linux macOS iOS、tvOS、MacCatalyst Android
DSACryptoServiceProvider ✔️ ⚠️1 ⚠️1 ⚠️1
DSACng ✔️
DSAOpenSsl ✔️ ⚠️2

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

2 macOS では、OpenSSL がインストールされていて、ダイナミック ライブラリを読み込むことで適切な libcrypto dylib を検出できる場合に DSAOpenSsl が機能します。 適切なライブラリを検出できない場合は、例外がスローされます。

X.509 証明書

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

PKCS12/PFX を読み取る

シナリオ Windows Linux macOS iOS、tvOS、MacCatalyst Android
Empty ✔️ ✔️ ✔️ ✔️ ✔️
証明書が 1 つ、秘密キーなし ✔️ ✔️ ✔️ ✔️ ✔️
証明書が 1 つ、秘密キーあり ✔️ ✔️ ✔️ ✔️ ✔️
証明書が複数、秘密キーなし ✔️ ✔️ ✔️ ✔️ ✔️
証明書が複数、秘密キーが 1 つ ✔️ ✔️ ✔️ ✔️ ✔️
証明書が複数、秘密キーが複数 ✔️ ✔️ ✔️ ✔️ ✔️

PKCS12/PFX を書き込む

シナリオ Windows Linux macOS iOS、tvOS、MacCatalyst Android
Empty ✔️ ✔️ ✔️ ✔️ ✔️
証明書が 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 Core および .NET 5 でも動作します。

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

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

個人用ストア

シナリオ Windows 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 です。

ルート ストア

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

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

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 が発生します。 コンテンツが既に取得されている場合に Disallowed ストアを開くと、CryptographicException がスローされます。

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

存在しないストア

シナリオ Windows 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

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

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

その他のリソース