如何设置服务证书存储的权限?

如何设置服务证书存储的权限?

我有一项服务需要访问其自己的证书存储,但访问被拒绝。

我使用 mmc 和证书管理单元检查了该服务,发现存储存在且包含证书。但是,在管理单元中我无法查看或设置权限。

我尝试使用 certutil 转储证书(用于测试,稍后更改权限),但一直出现“参数不正确”的失败信息。我使用的语法是

certutil -service -store 服务名称\my

servicename 是我的服务的名称,certutil 正确地将“my”识别为该服务的“个人”存储的名称。我知道该存储存在,因为 mmc 显示了它。

我对 certutil 做错了什么?

答案1

我认为您无法将证书导入其他用户的个人存储。我建议将其添加到机器的存储中,并让服务用户访问那里的证书/密钥。您也可以尝试以服务用户身份登录/运行并以这种方式添加它,但我从未尝试过。

编辑:我已在测试后确认了这一点,尽管由于 certutil 的文档记录不佳,我不确定这是否是预期的行为。certutil.exe -store -service (StoreName)似乎是访问服务存储下的证书的正确语法。服务存储位于HKLM\SOFTWARE\Microsoft\Cryptography\Services\(ServiceName)\注册表中,但 certutil 在搜索时会插入当前用户的 SID 而不是服务名称,如下所示:HKLM\Software\Microsoft\Cryptography\Services\(SID)\SystemCertificates\,导致搜索失败。您可以使用参数覆盖 SID -sid,但如果您提供服务名称,它似乎不起作用。如果您使用查找服务 SIDsc.exe showsid (ServiceName)并将其插入,它会显示“用户名或密码不正确”。似乎 certutil 仅支持几个众所周知的 SID(我甚至尝试将服务 SID 转换为其数字形式)。如果您想复制我的工作,您需要破解 Procmon。

因此,在发现这一点后,我假设您只有在服务上下文中运行 certutil 时才能导入证书。解决问题的最简单方法似乎是

  1. 手动编辑注册表
  2. 将证书存储在机器存储中,并向其授予服务权限
  3. 将证书存储在服务运行用户的用户存储中

相关内容