(注: IMO の質問は主に WinAPI と DACL に関するものであり、CNG に関するものではないので、読み進めてください!)
私は現在、Microsoft の Cryptographic Provider Development Kit のサンプル CNG キー ストレージ プロバイダーを、キーが単一のファイルに格納されないように変更しようとしています。ただし、秘密鍵に割り当てることができるセキュリティ記述子に問題があります。
Windows Server 管理コンソールの証明書スナップインでは、証明書の秘密キーを管理できます。つまり、キーの所有者、DACL、および SACL を変更できます。これにより、セキュリティ記述子をパラメータとして NCryptSetProperty 呼び出しが行われます。DACL の場合、スナップインは「フル コントロール」または「読み取り」の許可/拒否のみを許可するため、ACE のアクセス マスクに GENERIC_ALL または GENERIC_READ ビットが設定されます。
私が学んだように、これらの汎用ビットはアプリケーション固有の権利にマップする必要があります。そうしないと、AccessCheck は機能しません。しかし、私は本当にこれを手作業で行う必要がありますか???
CreatePrivateObjectSecurity+SetPrivateObjectSecurity は常に機能するとは限りません。これは、CreatePrivateObjectSecurity が入力セキュリティ記述子の所有者とグループについて非常にうるさいためです。さらに、マッピングが適用されると、アクセス マスクのジェネリック ビットがクリアされるため、スナップインで誤った設定が表示されます (前述したように、スナップインは現在のアクセス許可を表示するときに GA ビットと GR ビットのみを考慮します)。
ここにいくつかのピースが欠けているようです...