Joh*_*ero 4 cryptography cryptoapi visual-studio
多年以来,我们一直将强名密钥保存在密钥容器中。Visual Studio不直接支持它,但是,如果您只编辑.csproj文件并添加:
<KeyContainerName>MyKeyName</KeyContainerName>
Run Code Online (Sandbox Code Playgroud)
我们通过执行以下操作将密钥安装到密钥存储中:
sn -m Y
sn -i MyKeyFile.snk MyKeyName
Run Code Online (Sandbox Code Playgroud)
然后,我们可以从该计算机上删除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)
Run Code Online (Sandbox Code Playgroud)
看起来密钥容器在重新启动时丢失了,但是,如果这样做,则:
sn -m Y
sn -i MyKeyFile.snk MyKeyName
Run Code Online (Sandbox Code Playgroud)
它失败并显示:
Failed to install key pair -- Object already exists.
Run Code Online (Sandbox Code Playgroud)
我们必须使用sn -d删除密钥容器,然后将其重新添加,Visual Studio很高兴。
这里发生了什么?当sn可以看到它时,为什么Visual Studio在重新启动后看不到我们的密钥容器?密钥容器实际存储在哪里?
首先,在使用“ 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名称”以安装密钥时,将在该目录中创建一个文件。该文件用几个GUID命名,因此您必须查看修改日期才能确定刚创建的文件。
如果您检查新文件的属性并查看“安全性”选项卡,则会看到“ LogonSessionId_n_nnn”条目。ACL中的该条目授予您的登录会话访问权限,但是,如果重新启动,您将获得另一个登录会话,因此该条目不再授予您访问权限。这就是为什么我们可以安装强名称密钥并在重新启动之前使用它们的原因。它还说明了为什么在重新安装密钥之前需要先删除密钥,但是密钥仍然存在,但是我们无权访问。
您可以编辑该文件的ACL,并使用AD用户名或组授予自己“读取,读取和执行”访问权限,即使重新启动后,强名称密钥也将起作用。
归档时间: |
|
查看次数: |
1107 次 |
最近记录: |