Я создал контейнер RSA Machine-Store как не администратор и назначил себе полный доступ, а также доступ для чтения к другим учетным записям.
Я хочу иметь возможность программно просматривать ACL для контейнера ключей. Когда я пытаюсь сделать это с помощью приведенного ниже кода, я получаю следующее исключение, хотя я являюсь владельцем контейнера ключей и имею полный доступ:
System.Security.AccessControl.PrivilegeNotHeldException: The process does not possess the 'SeSecurityPrivilege' privilege which is required for this operation.
at System.Security.AccessControl.Privilege.ToggleState(Boolean enable)
at System.Security.Cryptography.Utils.GetKeySetSecurityInfo(SafeProvHandle hProv, AccessControlSections accessControlSections)
at System.Security.Cryptography.CspKeyContainerInfo.get_CryptoKeySecurity()
...
Я могу просмотреть привилегии с помощью проводника Windows или CACLS для просмотра файла ключа в C: \ Documents and Settings \ All Users \ ... \ Crypto \ RSA \ MachineKeys
, поэтому похоже, что у моей учетной записи есть необходимые привилегии.
Я использую следующий код:
CspParameters cp = new CspParameters();
cp.Flags = CspProviderFlags.NoPrompt | CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore;
cp.KeyContainerName = containerName;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp))
{
// PrivilegeNotHeldException thrown at next line while
// dereferencing CspKeyContainerInfo.CryptoKeySecurity
if (rsa.CspKeyContainerInfo.CryptoKeySecurity != null)
{
foreach (CryptoKeyAccessRule rule in rsa.CspKeyContainerInfo.CryptoKeySecurity.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)))
{
... process rule
}
}
}
Там вопрос с аналогичной проблемой , но я не вижу способа применить ответ в моей ситуации.
Согласно MSDN , свойство CspKeyContainerInfo.CryptoKeySecurity
:
Получает объект CryptoKeySecurity, который представляет права доступа и правила аудита для контейнера.
Мне нужен объект, представляющий права доступа, но не правила аудита (так как у меня нет привилегии для правил аудита).
ОБНОВЛЕНИЕ
Я нашел обходной путь: найти файл, содержащий контейнер ключей, и проверить его ACL. Я не совсем доволен этим, поскольку это зависит от недокументированных деталей реализации классов криптографии (например, предположительно, не будет работать на Mono), и все равно было бы интересно найти лучшее решение.
... Initialize cp as above
CspKeyContainerInfo info = new CspKeyContainerInfo(cp);
string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData),
"Microsoft\\Crypto\\RSA\\MachineKeys\\" + info.UniqueKeyContainerName);
FileSecurity fs = new FileInfo(path).GetAccessControl(AccessControlSections.Access);
foreach (FileSystemAccessRule rule in fs.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)))
{
... process rules
}