.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 と同等のものがマネージド コードを使用して実装されています。
アルゴリズム | 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 ビルド 25324 以降 | OpenSSL 1.1.1 以降 | ❌ | ❌ | ❌ | ❌ |
SHA-3-3841 | Windows 11 ビルド 25324 以降 | OpenSSL 1.1.1 以降 | ❌ | ❌ | ❌ | ❌ |
SHA-3-5121 | Windows 11 ビルド 25324 以降 | OpenSSL 1.1.1 以降 | ❌ | ❌ | ❌ | ❌ |
SHAKE-1281 | Windows 11 ビルド 25324 以降 | OpenSSL 1.1.1+3 | ❌ | ❌ | ❌ | ❌ |
SHAKE-2561 | Windows 11 ビルド 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 ビルド 25324 以降 | OpenSSL 1.1.1 以降 | ❌ | ❌ | ❌ | ❌ |
HMAC-SHA-3-3841 | Windows 11 ビルド 25324 以降 | OpenSSL 1.1.1 以降 | ❌ | ❌ | ❌ | ❌ |
HMAC-SHA-3-5121 | Windows 11 ビルド 25324 以降 | OpenSSL 1.1.1 以降 | ❌ | ❌ | ❌ | ❌ |
KMAC-1282 | Windows 11 Build 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
KMAC-2562 | Windows 11 Build 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
KMAC-XOF-1282 | Windows 11 Build 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
KMAC-XOF-2562 | Windows 11 Build 26016+ | OpenSSL 3.0+ | ❌ | ❌ | ❌ | ❌ |
1.NET 8 以降で利用可能。
2.NET 9 以降で使用可能です。
3ストリーミング拡張出力関数 (XOF) は、.NET 9 以降で使用できます。 Linux では、OpenSSL 3.3 が必要です。
対称暗号化
基になる暗号とチェーンは、システム ライブラリによって処理されます。
暗号 + モード | 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.AesCcm、 System.Security.Cryptography.AesGcm、 System.Security.Cryptography.ChaCha20Poly1305 クラスで提供されます。
認証付き暗号では、アルゴリズムをサポートするために新しいプラットフォーム 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.dylib
、 libcrypto.41.dylib
、および libcrypto.42.dylib
は、LibreSSL のライブラリであり、今後は使用されません。
macOS での AES-GCM と ChaCha20Poly1305
macOS では、macOS 10.15 までサードパーティのコードに対して AES-GCM または ChaCha20Poly1305 がサポートされていませんでした。 .NET 8 より前では、 AesGcm と ChaCha20Poly1305 には AES-CCM と同じ要件があり、これらの種類が機能するためには、ユーザーは OpenSSL をインストールする必要があります。
.NET 8 以降、macOS の .NET では、AES-GCM および ChaCha20Poly1305 に対して Apple の CryptoKit フレームワークが使用されます。 ユーザーは、macOS 上の AES-GCM または ChaCha20Poly1305 用に追加の依存関係をインストールまたは構成する必要はありません。
iOS、tvOS、MacCatalyst 上の AES-GCM と ChaCha20Poly1305
AES-GCM と ChaCha20Poly1305 のサポートは、iOS および tvOS 13.0 以降の .NET 9 以降、およびすべてのバージョンの MacCatalyst で利用できます。
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 バイト) タグの作成または処理がサポートされています。 Apple プラットフォームでは、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 項目であり、変更される可能性があります。
- X509Certificate2 の GetRSAPublicKey 拡張メソッドから、 RSACng インスタンスが返されます。 この RSACng の使用は実装の 1 項目であり、変更される可能性があります。
- X509Certificate2 の GetRSAPrivateKey 拡張メソッドでは現在 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 項目であり、変更される可能性があります。
- X509Certificate2 の GetDSAPublicKey 拡張メソッドから、 DSACng インスタンスが返されます。 この DSACng の使用は実装の 1 項目であり、変更される可能性があります。
- X509Certificate2 の GetDSAPrivateKey 拡張メソッドでは 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\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 の既定のパス内にある 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
を使用して、異なる場所でキーチェーンを開くこともできます。 結果として得られる IntPtr
を new X509Store(IntPtr)
に渡して、現在のユーザーのアクセス許可に従って、読み取り/書き込み可能なストアを取得できます。
X509Chain
オフライン CRL の使用は macOS によりサポートされていないため、 X509RevocationMode.Offline
は X509RevocationMode.Online
として扱われます。
CRL (証明書失効リスト)/OCSP (オンライン証明書状態プロトコル)/AIA (機関情報アクセス) のダウンロードでユーザーが開始するタイムアウトは macOS によりサポートされていないため、 X509ChainPolicy.UrlRetrievalTimeout
は無視されます。
その他のリソース
.NET