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

Ric*_*lay 5 windows-server-2008

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

我能找到的最好的信息是Working with Certificates,它说:

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

但是我找不到有关如何修改store的 ACL 列表的任何信息。我能找到的最好的与个人证书有关,但这不是我所追求的。

到目前为止,我尝试过的是尝试通过 MMC 界面查找 UI,并尝试将Get/Set-AclCmdlets 与cert:\LocalMachine\WebHosting. 前者一无所获,后者未能说明该文件夹不支持 ACL。

有什么想法吗?

Ric*_*lay 5

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

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

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

下面是一个脚本,可用于授予对“虚拟主机”存储导入证书的访问权限:

$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
Run Code Online (Sandbox Code Playgroud)