2015-09-23 50 views
2

多年來,我們一直將我們的強名密鑰保存在一個關鍵容器中。 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可以看到它?關鍵容器實際存儲在哪裏?

回答

3

首先,使用「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用戶名或組授予自己「讀取,讀取&執行」權限,強名稱密鑰即使在重新啓動後也能工作。

相關問題