在 Windows(服务器)中导入 LocalMachine 证书的最低权限

在 Windows(服务器)中导入 LocalMachine 证书的最低权限

我正在研究将证书导入特定本地机器存储所需的最低权限。

我能找到的最好的信息是使用证书,其中写道:

商店受到访问控制列表 (ACL) 的保护,就像计算机上的文件夹一样。

但我找不到任何关于如何修改 ACL 列表的信息店铺我能找到的最好的信息与个人证书有关,但这不是我想要的。

到目前为止,我尝试过通过 MMC 界面查找 UI,并尝试使用Get/Set-AclCmdlet cert:\LocalMachine\WebHosting。前者没有找到任何结果,后者失败,提示文件夹不支持 ACL。

有什么想法吗?

答案1

事实证明,证书存储主要基于注册表(PK 存储在磁盘上,但不需要特殊访问权限,因此可以忽略),并使用注册表 ACL 进行访问。

本地机器证书都存储在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\

X509Store.Open(ReadWrite)我还发现,如果未设置,即使使用的本机 API 也会失败,因此无法授予“写入但不能删除”访问权限。

下面是可用于授予“Web Hosting”商店导入证书的访问权限的脚本:

$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

相关内容