如何授予用户访问 Windows Server 2012 上的证书存储的权限?

如何授予用户访问 Windows Server 2012 上的证书存储的权限?

过去几天我一直在努力解决一个似乎无法解决的问题。虽然我对一些管理任务有所了解,但我不是管理员。

我有一个使用 XapSignTool.exe 来签名 .xap 包的 PowerShell 脚本。提供了私钥和密码。当我以管理员组中的用户身份登录时运行该脚本时,它可以正常工作。

我还在同一台机器上运行 Windows 远程管理服务。在另一台 Linux 机器上,我使用 winrm 协议调用带有所需参数的 PowerShell 脚本。然后,XapSignTool.exe 工具(具体来说是 signtool.exe,它在下面使用)会抛出一个错误:

Error information: "Error: Store::ImportCertObject() failed." (-2146893808/0x80090010)

我查看了代码并发现了它的含义,即

NTE_PERM
0x80090010
访问被拒绝。

ImportCertObject() 方法的名称使我认为该工具尝试将提供的私钥导入到证书存储区。

有趣的是,如果我在登录后首先运行该脚本并且它有效,则通过 winrm 进行的后续调用也会有效。这使我相信证书已通过管理员用户正确导入。

WRM 服务在网络服务帐户下运行,因此我假设它没有权限插入证书存储。我将 NS 帐户放入管理员组中,希望它能正常工作,但事实并非如此。为了进行测试,我将 \Everyone 放入管理员组,但对 PowerShell 脚本的 winrm 调用仍然失败,并显示“拒绝访问”。

这是为什么?如何授予用户访问证书存储的权限?

我也希望能够对许多这样的证书执行此操作,因此它必须是自动化的。

答案1

经过几天的研究,我并没有找到最低意义层面上的原因,而是找到了比这稍微高一点的原因。

当登录的用户已在计算机上以交互方式登录时,脚本会运行。如果我退出计算机,则脚本将停止运行。

这是 WinRM 的问题,解决方法之一是改用 CredSSP。解决此问题的另一种方法是将整个解决方案更改为 HTTP 服务或消息队列消费者。

答案2

遇到了类似的问题,signtool.exe 返回“错误:Store::ImportCertObject() 失败。”(-2146893808/0x80090010)。就我而言,我通过 ssh 从 Linux 连接,而 sshd 托管在 Cygwin 环境 shell 中。

以下帖子位于https://cygwin.com/ml/cygwin/2008-10/msg00588.html. 似乎很相关。(另见 -https://cygwin.com/ml/cygwin/2007-01/msg00651.html

通过 ssh 登录时,请使用密码验证而不是公钥验证。密码验证会创建一个有效的登录会话,因此您可以被正确识别,问题就会消失。

底线是,要么基于用户密码登录,要么设置具有适当权限的服务帐户。在使用基于证书的身份验证时,用户模拟似乎无法按预期工作。

虽然是一篇老帖子,但希望其他人可能会觉得它有用。

答案3

我遇到了与此类似的错误,当我搜索它时,除了这个之外没有出现任何相关内容,所以我只是想发布我的解决方案,以防其他人遇到我的问题。

不同之处在于错误代码为“(-2146893792/0x80090020)”,而不是原始帖子中的错误代码。

问题出在我将证书存储从 JKS 转换为 PFX 时。我使用旧版本的 Java Keytool 进行转换,它没有警告我更改密钥存储密码与更改证书的私钥密码不同。所以我最终得到了不同的密码,大多数工具(包括 SignTool)都假设密码相同。进行新的转换,确保将私钥和存储密码设置为相同的密码,解决了这个问题。

答案4

我遇到了同样的问题。Jenkins 代理(Windows 按需 EC2)不允许在代码签名时使用 PFX 文件。管道作业中的 whoami 显示用户是 Windows 管理员,但我猜 Jenkins 也使用 WinRM(可能?),它以网络系统运行。奇怪的是,通过 RDP 登录到 ec2 允许相同的代码通过之前出错的管道工作。所以是的,直接登录到 EC2 并重新运行作业,一切就都好了。

我的解决方法是使用 import-pfxcertificate 将 PFX 导入 Cert:\LocalMachine\My & Cert:\LocalMachine\Root,然后使用带有 /sm 参数的 signtool,而不是直接将其指向 pfx 文件。我希望这对某些人有帮助,这个问题浪费了我很多时间。

相关内容