2015-09-23 2 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, а сильный ключ ключа будет работать даже после перезагрузки.