Строгое имя sn.exe: не удалось установить пару ключей - объект уже существует

У меня есть 2 разные версии одного и того же проекта на моей машине. Один из транка кода, а другой из ветви кода. Эти проекты используют ключ.pfx для включения сильного именования. Когда я впервые попытался скомпилировать транковую версию проекта, я получил следующую ошибку:

Невозможно импортировать следующий файл ключей: sgKey.pfx. Файл ключа может быть защищен паролем. Чтобы исправить это, попробуйте снова импортировать сертификат или вручную установить сертификат в CSP со строгим именем со следующим именем контейнера ключей: VS_KEY_45891C38BC1BB345

Для решения этой проблемы я использую sn.exe с помощью следующей команды:

sn -i sg Key.pfx VS_KEY_45891C38BC1BB345

Это решает проблему с проектом ствола, который затем успешно собирается.

Тем не менее, когда я пытаюсь построить версию ветвления проекта, я получаю ту же первоначальную ошибку (с тем же именем контейнера ключей), и когда я пытаюсь установить сертификат, используя sn.exe, он (что неудивительно) выдает следующую ошибку:

Не удалось установить пару ключей - объект уже существует

Это имеет смысл в том смысле, что я использовал те же infile и container для команды sn, но я пытаюсь понять это:

  1. Если этот объект уже существует, почему проект не может быть собран, так как может показаться, что сертификат уже установлен.
  2. Как решить эту проблему (например, могу ли я удалить, а затем переустановить? И если да, то как?)

2 ответа

Решение

Мне удалось решить мою проблему, не полностью понимая причину. Я нашел пост о подобной проблеме здесь, но он не соответствовал моим обстоятельствам точно, поскольку я только когда-либо входил в свою машину как единственный пользователь.

В посте было показано, как удалить контейнер, но я тоже не смог этого сделать, так как в нем говорилось, что контейнер не существует. Однако он предложил мне запустить командную строку от имени администратора, чего я раньше не делал. Это позволило мне удалить и переустановить сертификат, и обе версии проекта теперь успешно собираются.

Я предполагаю, что каким-то образом сертификат был первоначально установлен (мной) под другим пользователем, чем тот, который я пытался установить во второй раз, хотя я не знаю, почему это произойдет, так как я когда-либо входил в систему только машина как один пользователь. Для меня это остается загадкой.


Резюме:

  1. Запустите командную строку разработчика от имени администратора, в противном случае вы получите вводящую в заблуждение ошибку о том, что контейнер не существует.
  2. Запустите sn -d VS_KEY_XXXXXXXXXXX, чтобы удалить старый ключ.
  3. Теперь вы сможете переустановить сертификат.

У нас была такая же проблема после "обновления" в Windows 10. Вот что сработало для нас:

  1. Запустите командную строку от имени администратора.
  2. Запустите sn -m n, чтобы сделать сертификаты основанными на пользователях, а не на компьютерах.
  3. Установите сертификат как обычно (либо "sn -i VS_KEY_XX", либо используя диалог "Свойства" в VS).

Это было похоже на то, как обновление сохраняло старые контейнеры в некоторой скрытой области, где они не могли быть удалены (но также мешали добавлению того же контейнера). Переход к пользовательскому режиму позволяет с чистого листа с точки зрения текущего пользователя. Обратите внимание, что если у вас есть несколько пользователей на одном компьютере, вероятно, каждый из них должен будет зарегистрировать сертификаты.

Другие вопросы по тегам