在过去的几天里,我已经解决了一个我似乎无法解决的问题。 尽pipe我对某些pipe理任务有一些了解,但我不是pipe理员。
我有一个使用XapSignTool.exe签署.xap软件包的PowerShell脚本。 提供私钥和密码。 当我以pipe理员组中的用户身份login时运行脚本时,它工作正常。
我也在同一台机器上运行Windows远程pipe理服务。 从另一台Linux机器上,我使用winrm协议来调用带有所需参数的PowerShell脚本。 然后XapSignTool.exe工具,或者下面使用的signtool.exe引发错误:
Error information: "Error: Store::ImportCertObject() failed." (-2146893808/0x80090010)
我查找了代码,发现它的意思,即
NTE_PERM
0x80090010
拒绝访问。
ImportCertObject()方法的名称使我觉得该工具试图将提供的私钥导入证书存储区。
有趣的是,如果我第一次运行脚本,而login,它的工作,通过winrm后续调用工作。 这导致我相信证书与pipe理员用户正确导入。
WRM服务在networking服务帐户下运行,所以我认为它没有权限插入证书存储区。 我把NS帐户放在pipe理员组中,希望它可以工作,但事实并非如此。 对于testing,我把\ Everyonepipe理员组和winrm调用到PowerShell脚本仍然失败,'访问被拒绝'。
为什么是这样? 我怎样才能让用户访问证书存储?
我也希望能够为许多这样的证书做到这一点,所以它必须是自动的。
经过几天的研究,我没有find原因在最低的有意义的水平,但略高于达。
该脚本在用户login时工作,因为已经以交互方式login到机器上。 如果我退出机器,则脚本停止工作。
这是WinRM的一个问题,其中一个解决方法是使用CredSSP来代替。 解决此问题的另一种方法是将整个解决scheme更改为HTTP服务或消息队列使用者。
我有一个类似这样的错误,当我search它没有任何相关的,除了这个,所以我只是想发布我的解决scheme,以防其他人来到这里与我的问题。
区别在于错误代码是“(-2146893792 / 0x80090020)”,而不是原始文章中的错误代码。
问题结果是当我从JKS转换为证书存储区的PFX时。 我使用旧版本的Java Keytool来进行转换,它并没有警告我改变密钥库密码与改变证书的私钥密码不同。 所以我结束了不同的密码,大多数工具(包括SignTool)都假设密码是一样的。 做一个新的转换,确保将私钥和存储密码设置为相同的事情解决了这个问题。