我有一项服务需要访问其自己的证书存储,但访问被拒绝。
我使用 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 时才能导入证书。解决问题的最简单方法似乎是
- 手动编辑注册表
- 将证书存储在机器存储中,并向其授予服务权限
- 将证书存储在服务运行用户的用户存储中