Назад | Перейти на главную страницу

Минимальные разрешения для импорта сертификата LocalMachine в Windows (Server)

Я изучаю минимальные разрешения, необходимые для импорта сертификата в конкретное хранилище локального компьютера.

Лучшая информация, которую я могу найти, - это Работа с сертификатами, где сказано:

Магазины защищены списками контроля доступа (ACL), как и папки на компьютере.

Но я не могу найти никакой информации о том, как изменить список ACL для хранить. Лучшее, что я могу найти, касается индивидуальных сертификатов, но мне это не нужно.

До сих пор я пытался найти пользовательский интерфейс через интерфейс MMC и пытался использовать Get/Set-Acl Командлеты с cert:\LocalMachine\WebHosting. Первый ничего не нашел, а второй не может сказать, что папка не поддерживает ACL.

Есть предположения?

Оказывается, что хранилища сертификатов в основном основаны на реестре (PK хранятся на диске, но специального доступа не требуется, поэтому его можно игнорировать) и для доступа используются списки ACL реестра.

Сертификаты локального компьютера хранятся в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\

Я также обнаружил, что невозможно предоставить доступ «Запись, но не удаление», поскольку даже собственные API, используемые X509Store.Open(ReadWrite) потерпит неудачу, если он не установлен.

Ниже приведен сценарий, который можно использовать для предоставления доступа для импорта сертификатов в магазин «Веб-хостинг»:

$username = "SomeNonAdminUser"
$acl = Get-Acl HKLM:\SOFTWARE\Microsoft\SystemCertificates\WebHosting

$rule = $acl.Access | ?{ $_.IdentityReference -like "*\$username" }

if ($rule)
{
    $rule | %{ $acl.RemoveAccessRule($_) | Out-Null }
}

$rule = New-Object System.Security.AccessControl.RegistryAccessRule `
    $username, `
    [System.Security.AccessControl.RegistryRights]"CreateSubKey, ReadKey, SetValue, Delete", `
    [System.Security.AccessControl.InheritanceFlags]"ContainerInherit, ObjectInherit", `
    [System.Security.AccessControl.PropagationFlags]"None", `
    "Allow"

$acl.AddAccessRule($rule)

$acl | Set-Acl