强名称 sn.exe:无法安装密钥对 -- 对象已存在

Posted

技术标签:

【中文标题】强名称 sn.exe:无法安装密钥对 -- 对象已存在【英文标题】:Strong Name sn.exe: Failed to install key pair -- Object already exists 【发布时间】:2014-07-08 09:00:32 【问题描述】:

我的机器上有同一个项目的 2 个不同版本。一个来自代码主干,另一个来自代码分支。这些项目使用 .pfx 密钥来启用强命名。当我第一次尝试编译项目的主干版本时,我收到以下错误:

无法导入以下密钥文件:sgKey.pfx。密钥文件可能受密码保护。要更正此问题,请尝试再次导入证书或手动将证书安装到具有以下密钥容器名称的强名称 CSP:VS_KEY_45891C38BC1BB345

为了解决这个问题,我使用带有以下命令的 sn.exe:

sn -i sg Key.pfx VS_KEY_45891C38BC1BB345

这解决了主干项目的问题,然后愉快地构建了。

但是,当我尝试构建项目的分支版本时,我收到相同的初始错误(具有相同的密钥容器名称),并且当我尝试使用 sn.exe 安装证书时(毫不奇怪)给出以下错误:

安装密钥对失败 -- 对象已存在

这是有道理的,因为我在 sn 命令上使用了相同的 infilecontainer,但我想了解的是:

    如果此对象已存在,为什么项目无法构建,因为它似乎已安装证书。 我如何解决这个问题(例如,我可以卸载然后重新安装吗?如果可以,如何解决?)

【问题讨论】:

【参考方案1】:

我已经设法解决了我的问题,但没有完全了解原因。我发现了一篇关于类似问题 here 的帖子,但并不完全适合我的情况,因为我只以单个用户身份登录过我的机器。

帖子显示了如何删除容器,但我也不能这样做,因为它说容器不存在。它所做的只是提示我以管理员身份运行命令提示符,这是我以前没有做过的。这使我可以卸载并重新安装证书,现在项目的两个版本都已成功构建。

我的假设是,证书最初是在与我第二次尝试安装的用户不同的用户下(由我)安装的,尽管我不知道为什么会这样,因为我只做过以单个用户身份登录到机器。这对我来说仍然是个谜。


总结:

    以管理员身份启动开发者命令提示符,否则您会收到误导性错误,提示您容器不存在。 运行 sn -d VS_KEY_XXXXXXXXXXX 删除旧密钥。 您现在应该可以重新安装证书了。

【讨论】:

非常感谢您跟进此事。这正是我所处的情况,你的修复对我有用。我最初使用我的 Microsoft 帐户登录 Windows 8.1,安装了证书,然后意识到我打算以我的域用户身份登录 Windows。我从机器上删除了旧用户帐户,但显然以前的证书安装(仍然)有不良影响。不要忘记将您的答案标记为正确。 我很高兴能为 John 提供帮助,并感谢您对步骤进行总结的编辑。 感谢您的回答,挽救了我的理智。不过,对于接下来的人来说,请注意,在重新安装密钥后,我必须重新启动 Visual Studio 才能让它注意到更改。 感谢@Chris 的回答。它解决了我的存在;) 在哪里可以找到VS_KEY_XXXXXXXXXXX??【参考方案2】:

在 Windows 10 上执行“刷新”后,我们遇到了同样的问题。以下是对我们有用的方法:

    以管理员身份启动命令提示符。 运行“sn -mn”以使证书基于用户而不是基于机器。 照常安装证书(“sn -i VS_KEY_XX”或使用 VS 中的“属性”对话框)。

这就像刷新将旧容器存储在某个隐藏区域,无法删除它们(但也干扰了相同容器的添加)。从当前用户的角度来看,更改为基于用户允许一个全新的状态。请注意,如果您在同一台机器上有多个用户,他们可能都需要注册证书。

【讨论】:

谢谢你救了我!

以上是关于强名称 sn.exe:无法安装密钥对 -- 对象已存在的主要内容,如果未能解决你的问题,请参考以下文章

使用 PFX 进行强命名

.Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法

强名称 CSP 的 TFS 构建错误证书

如何查找 pip3 已安装模块的导入名称/密钥

如何在 Linux 中为强命名程序集创建 .NETCore 的 snk

win8输密钥出现问题:尝试使用此密钥是发生以下故障0xc0000022过程已请求访问一对象但未给访问权限