Как просмотреть разрешения для контейнера ключей RSA

Я создал контейнер 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
}

14
задан Community 23 May 2017 в 12:25
поделиться