【问题标题】:Why do I lose my key container when I reboot?为什么我在重启时丢失了我的密钥容器?
【发布时间】:2015-09-23 17:03:13
【问题描述】:

多年来,我们一直将强名称密钥保存在密钥容器中。 Visual Studio 不直接支持,但如果您只编辑 .csproj 文件并添加:

<KeyContainerName>MyKeyName</KeyContainerName>

我们通过以下方式将密钥安装到密钥库中:

sn -m Y
sn -i MyKeyFile.snk MyKeyName

然后我们可以从那台机器上删除 MyKeyFile.snk 并且密钥更加安全。

最近,这已成为重启后的问题。我们怀疑这个问题是由 VS 2015 引入的,但它可能是由 Windows 8 和/或 10 引起的。我们将密钥安装到密钥容器中,一切正常。然后,我们重启那台机器,构建失败:

CSC : error CS7028: Error signing output with public key from container 'MyKeyName' -- Keyset does not exist (Exception from HRESULT: 0x80090016)

看起来密钥容器在重新启动时丢失了,但如果我们这样做了:

sn -m Y
sn -i MyKeyFile.snk MyKeyName

它失败了:

Failed to install key pair -- Object already exists.

我们必须使用 sn -d 删除密钥容器,然后将其添加回来,Visual Studio 很高兴。

这里发生了什么?为什么重新启动后 Visual Studio 看不到我们的密钥容器,而 sn 可以看到它?关键容器实际存放在哪里?

【问题讨论】:

    标签: visual-studio cryptography cryptoapi


    【解决方案1】:

    首先,在使用“sn -m”命令在基于机器的密钥和基于用户的密钥之间切换时需要小心。该命令区分大小写,并且处理无效值,就像未指定值一样,显示当前设置。因此,“sn -m Y”不启用基于机器的键,您必须说“sn -m y”(小写 y 或 n)。

    当前版本的 CSC.exe 似乎只使用基于机器的密钥。我不知道这是否是最近的变化,但这是我在使用 .NET V4.6 和 VS 2015 时观察到的行为。

    机器密钥保存在 C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys 中。当您执行“sn -i file.snk name”安装密钥时,会在该目录中创建一个文件。该文件以几个 GUID 命名,因此您必须查看修改日期以确定刚刚创建的文件。

    如果您检查新文件的属性并查看“安全”选项卡,您将看到“LogonSessionId_n_nnn”条目。 ACL 中的该条目授予您的登录会话访问权限,但如果您重新启动,您将获得不同的登录会话,因此该条目不再授予您访问权限。这就是为什么我们可以安装强名称密钥并使用它们直到我们重新启动。它还解释了为什么在重新安装之前需要删除密钥,密钥仍然存在,但我们无权访问它。

    您可以编辑该文件的 ACL,并使用 AD 用户名或组授予自己“读取、读取和执行”访问权限,即使在重新启动后,强名称密钥也将起作用。

    【讨论】:

      猜你喜欢
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多