我正在从PKCS#12文件中(使用PFXImportCertStore Cryptographic API)导入X509到计算机的个人存储区。
问题:
任何在“本地服务”帐户或任何非管理员帐户下运行的进程都无法访问私钥(由Windows限制为仅限管理员用户)。
如何将证书的私钥访问权限授予非管理员用户和本地服务?
注意:
由于多个进程使用证书,因此我更喜欢使用计算机存储区而不是用户存储区。
我正在从PKCS#12文件中(使用PFXImportCertStore Cryptographic API)导入X509到计算机的个人存储区。
问题:
任何在“本地服务”帐户或任何非管理员帐户下运行的进程都无法访问私钥(由Windows限制为仅限管理员用户)。
如何将证书的私钥访问权限授予非管理员用户和本地服务?
注意:
由于多个进程使用证书,因此我更喜欢使用计算机存储区而不是用户存储区。
这是一个棘手的问题,有一些陷阱。我曾经遇到过同样的问题,几乎绝望了,最后在this post中找到了拯救我的备注。
我成功地为运行在 Network Service
账户下的本地服务执行了此操作。
首先,有一个选项可以授予其他用户访问 MS 证书存储中证书的私钥的权限。我认为这已经属于德鲁伊知识了:此选项可在上下文菜单中找到(右键单击证书),但仅当证书驻留在 localMachine\Personal
存储中时才可用。在那里,在条目 All tasks
中,您将找到子条目 Manage Private Keys
。这在其他存储中甚至不在 CurrentUser\Personal
存储中都不可用。
此条目打开一个对话框,允许您为其他用户添加对证书的访问权限。在这里,下一个障碍等待着您:默认设置是在域中搜索用户,而不是在本地计算机上搜索。除非更改搜索过滤器,否则可能找不到所需的用户。
我通过谷歌搜索很快得到了这个结果,但它并没有帮助我。我可以让服务运行起来,但只有当我将服务用户更改为登录帐户时才能运行,这不是我想要的(顺便说一下,这导致了一个解决方法:为服务创建本地用户帐户,并从该用户帐户中导入证书。然后,您可以将证书放置在几乎任何存储区中,它将正常工作)。localMachine\Personal
,使用上下文菜单导入相关的证书。(我选择使私钥可导出,这可能在这里有或没有关联)。如果您通过在文件系统中双击证书来导入证书,则会将其导入到当前用户
位置的某个存储位置中。我曾经这样做,然后将其移动到localMachine\Personal
文件夹,并更改了访问权限--但这从来没有为我工作过。只有通过在MMC证书快捷菜单中从localMachine\Personal
导入它,它才能立即工作...
请注意,您需要将证书放置在服务用户可以找到的存储中。您当前的用户存储通常不允许此操作,因此localMachine是更好的选择。
我不知道您之后是否可以移动证书,但这很容易在系统中检查。