Невозможно импортировать файл ключа «blah.pfx» - ошибка «Файл ключа может быть защищен паролем»

393

Мы только что обновили наши проекты Visual Studio 2008 до Visual Studio 2010. Все наши сборки были подписаны с использованием сертификата подписи кода Verisign . После обновления мы постоянно получаем следующую ошибку:

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

Это происходит на некоторых машинах разработчика, а не на других. Некоторые методы, используемые для исправления этой проблемы, работали иногда:

  • Переустановка файла ключа из проводника Windows (щелкните правой кнопкой мыши файл PFX и выберите «Установить»)
  • При установке Visual Studio 2010 на новой машине в первый раз запрашивается пароль при первом открытии проекта, и затем он работает. На машинах, обновленных с Visual Studio 2008, вы не получаете эту опцию.

Я пытался использовать утилиту SN.EXE (инструмент строгого имени), чтобы зарегистрировать ключ в CSP строгого имени, как следует из сообщения об ошибке, но всякий раз, когда я запускаю инструмент с любыми параметрами, используя версию, поставляемую с Visual Studio 2010, SN .EXE просто перечисляет свои аргументы командной строки вместо того, чтобы что-либо делать. Это происходит независимо от того, какие аргументы я привожу.

Почему это происходит, и каковы четкие шаги, чтобы это исправить? Я собираюсь отказаться от установки ClickOnce и подписи кода Microsoft.

JasonD
источник

Ответы:

448

Я тоже столкнулся с этой проблемой. Я смог решить проблему, запустив
sn -i <KeyFile> <ContainerName>( устанавливает пару ключей в именованный контейнер ).

snобычно устанавливается как часть Windows SDK. Например C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe. Скорее всего, это местоположение не в пути поиска для вашей стандартной среды. Однако «Командная строка разработчика», установленная Visual Studio, добавляет дополнительную информацию, которая обычно содержит правильное расположение.

Исходя из вашего поста, который будет выглядеть

sn -i companyname.pfx VS_KEY_3E185446540E7F7A

Это должно быть выполнено из местоположения вашего файла PFX, если у вас есть решение, загруженное в VS 2010, вы можете просто щелкнуть правой кнопкой мыши по файлу pfx в обозревателе решений и выбрать «Открыть командную строку», которая запустит инструмент подсказки .net 2010 cmd в правильный каталог.

Перед запуском этой команды sn я переустановил pfx, щелкнув по нему правой кнопкой мыши и выбрав «установить», однако это не сработало. Просто кое-что, чтобы отметить, поскольку это могло быть комбинацией обоих, которые обеспечили решение.

Надеюсь, это поможет решить вашу проблему.

Брэндон Манчестер
источник
5
Спасибо Брэндону - да, это так, как ручная переустановка файла ключа "своего рода" решает проблему. Проблема заключается в том, что как только вы зарегистрируете файл ключа, все другие пользователи, которые получат последнюю информацию об этом файле ключа, теперь столкнутся с этой ошибкой. Если кто-то из этих пользователей отметит свои «исправления», и я получу последнюю версию, то моя машина снова выйдет из строя ... и так далее. Microsoft запустила заявку на устранение неполадок и назначила ее команде VS2010 и VSS.
JasonD
2
Интересно. Я не столкнулся с этой проблемой при добавлении pfx в новый CSP. Насколько мне известно, SN -i не изменяет файл pfx, поэтому вам не нужно ничего проверять впоследствии. Однако, если вы в любом случае измените файл pfx, например сброс пароля, это вызовет проблему, так как это изменит файл pfx. Ваше решение собирается с этим файлом pfx с любого другого компьютера? Если это так, то файл pfx является правильным, просто не установлен правильный CSP на вашем компьютере, который имеет проблемы со сборкой.
Брэндон Манчестер
3
Сначала я попробовал только часть sn -i, но он пожаловался на неправильный пароль (хотя и правильный). Я удалил сертификат, переустановил его и затем sn -i ... работал. В основном подтверждаю, что для меня оба шага были обязательными. Переустановите сертификат, затем выполните команду sn.
Dodgyrabbit
1
Я обнаружил как в VSS, так и в TFS, что если вы запускаете команду sn -i, она не будет работать, если у вас не извлечен файл PFX, а когда вы проверяете его, он не работает для других разработчиков в сети. Я должен попробовать переустановить сертификат и запустить команду sn -i. Нам нужно, чтобы он работал на всех машинах разработчиков в офисе.
JasonD
5
Это сработало и для меня, однако мне никогда не приходилось делать это в прошлом. VS просто всплывал и спрашивал пароль для каждого ключа. Что изменилось?
Кевин Берридж
126

Я обнаружил исправление, которое поможет вам успешно строить в среде с несколькими разработчиками:

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

У меня все еще проблемы с получением сборок для подписи на нашем компьютере с сервером сборки. Я получаю ту же ошибку, но использование метода sn.exe -i не решает проблему для сервера сборки.

MagicBox
источник
5
Потратил некоторое время на то, чтобы заставить это работать и на нашем сервере сборки TFS, осознав, что я вошел в систему как я, а не как учетная запись службы сборки, неудивительно, что он не смог его найти - черт!
Даниэль Морритт
7
Это должно быть помечено как ответ, так как ответ, отмеченный в данный момент, не будет работать в среде с несколькими разработчиками. Отлично сработано.
Даниэль Маккуистон
Если вы используете один и тот же файл .pfx для подписания нескольких сборок / проектов в одном решении, вам нужно выполнить этот шаг только для одного проекта, и он будет применяться ко всем из них. Работает отлично.
Джон Комтуа
1
Моя проблема заключалась в том, что сервер сборки работал под локальной учетной записью. Я пошел в варианты и изменил, но не понимал, что я изменил это в неправильном месте - который заставил меня искать неисправности в течение многих часов, пока я не проверил это снова и не понял свою ошибку!
The Muffin Man
3
Блестящее спасибо. Грустно видеть, что это все еще обходной путь в 2017 году.
Билли Джейк О'Коннор
43

У меня была та же проблема, и удаление магазина и чтение не работало. Я должен был сделать следующее.

  • Получить копию OpenSSL . Это доступно для Windows . Или используйте коробку Linux, поскольку у них всех есть это.

  • Выполните следующее для экспорта в файл ключа:

    openssl pkcs12 -in certfile.pfx -out backupcertfile.key
    
    openssl pkcs12 -export -out certfiletosignwith.pfx -keysig -in backupcertfile.key
    

Затем в свойствах проекта вы можете использовать файл PFX.

Beached
источник
1
Спасибо!! Я думаю, что это сработало для меня. Я взял openssl здесь: gnuwin32.sourceforge.net/packages/openssl.htm
aherrick
Я хотел бы добавить опцию для включения действительного сертификата в pfx: openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in Certificate.crt -certfile CACert.crt -keysig -keyex
Пит
Обязательно запустите openssl от имени администратора, иначе вы получите сообщение об ошибке «невозможно записать« случайное состояние »». Кроме того, мне все еще приходилось делать ответ Брэндона Манчестера с «sn -i ...» после выполнения openssl предмет.
Ли Ричардсон
Это единственное решение, которое наконец-то сработало у меня. Спасибо!
Ладислав
37

Я говорил слишком рано! Перестройка вернула ошибки в игру ...

Я нашел это работает - щелкните правой кнопкой мыши в Solution Explorer и исключите его из проекта. Нажмите Показать все файлы , щелкните правой кнопкой мыши и теперь снова включите его в проект. Теперь отмените ожидающие изменения ...

По какой-то причине это решило это для меня и было относительно безболезненно!

Майк Ф
источник
Взять его обратно, не помогло. Не осознавал, что удалил pfx из настроек проекта. Я думаю, что ответ лежит в ответе Стефана stackoverflow.com/a/14644793/1735721
DennisWelu
Этот ответ великолепен. Это сработало для меня, и это так просто.
Бен Рубин
Работал на меня (VS2017 15.7.4). Спасибо за хорошее и быстрое решение.
Встреча с участником
Работал у меня на VS2019 16.1.3. Спасибо!!
ИорданияTDN
35

Я обнаружил, что в некоторых случаях вы должны попытаться удалить этот ключ перед установкой. Так что сделайте следующее:

  1. sn -d VS_XXXX
  2. sn -i mykey.pfx VS_XXX
Дариуш
источник
1
Это исправило это для меня! Сама установка не удалась, так как объект уже существует.
Энди
Я тоже это попробовал, и это не помогло. Что-то не так с самим сертификатом?
Томаш Зато - Восстановить Монику
2
Спасибо, удаление должно быть выполнено от имени администратора - при запуске от имени обычного пользователя появляется ошибочная ошибка "Контейнер ключа строгого имени не найден".
астронавт
Спасибо Его работа для меня.
Рикин Патель
31

VSCommands 2010 (плагин для Visual Studio) может исправить это для вас автоматически - просто щелкните правой кнопкой мыши на ошибке и выберите Apply Fix из меню. Вы можете получить его из галереи Visual Studio .

Ярек Кардас
источник
1
Я считаю, что это для про-версии - у меня нет этой опции в моей облегченной версии
Адам Батлер
2
Версия, которую я только что скачал (в сентябре 2011), шла с этой опцией.
Джим считает
4
Это все еще требует профессиональную лицензию.
Джон Боуман
27

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

Поведение

Я понимаю, что «знак» применяет строгое имя, а не аутентичный код к DLL или EXE. Вот почему signtool будет работать в этом случае, но «sign» в Visual studio не будет работать.

причина

В прошлом у меня был опыт работы с сертификатами Verisign. Они имеют KeySpec=2сертификат, который используется с функциональностью «знак» в Visual Studio. Эти сертификаты отлично работают как для Visual Studio, так и для signtool.

Я теперь купил сертификаты у Comodo, которые имеют неверные KeySpec=1сертификаты подписи кода. Это означает, что эти сертификаты хорошо работают с signtool (authenticode), но не с сильными именами (выпадающий список).

Решение

Есть два способа решить эту проблему:

  1. Создайте отдельный сертификат для вашего строгого имени, используя sn -k [name].snk. Подпишите сборку с помощью snk, а затем используйте signtool с сертификатом подписи кода, чтобы подписать DLL / EXE с помощью подписи authenticode. Хотя это кажется странным, насколько я понимаю, это правильный способ работы с сертификатами, потому что строгие имена имеют другое назначение, чем authenticode (см. Также эту ссылку для получения подробной информации о том, как это работает).
  2. Импортируйте свой сертификат как KeySpec=2. Процедура для этого подробно здесь .

Поскольку я хочу использовать несколько строгих имен, в настоящее время я использую option (1), хотя option (2) также работает.


Чтобы гарантировать, что это решение никогда не потеряется в будущем, вот процедура решения 2:

  1. Используя MMC «Сертификаты», экспортируйте существующий набор ключей ( KeySpec=1) в файл PFX. Примечание. Пожалуйста, сделайте резервную копию этого файла в безопасном месте и проверьте, можно ли импортировать файл нормально на другой компьютер, если вы действительно хотите воспроизвести его безопасно!
  2. Удалите существующий сертификат из крипто-хранилища (stlll, используя MMC).
  3. Откройте приглашение CMD.
  4. Импортируйте файл PFX с помощью этой команды:
    1. certutil -importPFX -user <pfxfilename> AT_SIGNATURE
    2. Введите пароль для PFX, когда будет предложено.

Теперь у вас должен быть набор ключей / сертификат с KeySpec=2. При необходимости вы можете теперь экспортировать это в другой файл PFX, используя MMC снова.

atlaste
источник
Ваше решение №2 было единственным, что сработало для меня (без использования вторичного инструмента командной строки или процесса) Спасибо.
Брон Дэвис
1
Да, я действительно не понимаю, почему некоторые решения здесь имеют так много голосов; это действительно единственное, что сработало для меня, и я уверен, что большинство людей, которые покупают сертификат CS, должны иметь такую ​​же проблему. О, хорошо ...
Атлас
1
Это единственное решение, сработавшее для меня. Кроме того, файл .pfx не может содержать информацию о цепочке сертификатов для подписи сборок.
Ши-Вэнь Су
Спасибо за такую ​​подробную инструкцию. Каждый шаг описан точно.
Дмитрий
1
Ваше первое решение очень важно для понимания: абсолютно не нужно подписывать сборки с дорогим сертификатом, защищенным паролем! Как только вы понимаете это и просто используете файл snk, эта проблема полностью исчезает. Смотрите предупреждение здесь и здесь .
Павел
11

Чтобы решить эту проблему в Visual Studio 2012, я щелкаю правой кнопкой мыши проект, свойства -> «подписывание», а затем снимаю флажок «Подписывать манифесты ClickOnce».

Ромео
источник
2
Это идеальный ответ, если нет необходимости подписывать. Это избавит от необходимости подписывать проект.
Том Андерсон
8

Я повторно выбрал файл ключа (pfx) в раскрывающемся списке «Выберите файл ключа строгого имени», затем предоставил пароль во всплывающем окне «ВВОД ПАРОЛЯ». Сохранил мой проект и сделал rebuild.build успешно.

  • Откройте Свойства проекта.
  • Нажмите на раздел подписи.
  • Там, где написано «Выберите файл ключа строгого имени:», повторно выберите текущее значение из выпадающего списка:

введите описание изображения здесь

  • Visual Studio теперь предложит вам ввести пароль. Введите это.

введите описание изображения здесь

  • Сохраните ваш проект и сделайте перестройку.

  • Если получено сообщение об ошибке: «Была сделана попытка сослаться на несуществующий токен», просто проигнорируйте его и продолжите следующие шаги

  • Нажмите кнопку «Изменить пароль»:

введите описание изображения здесь

  • Введите оригинальный пароль во все три поля и нажмите ОК. Если вы хотите изменить свой пароль (или если ваш старый пароль не соответствует требованиям сложности), вы можете сделать это сейчас.

  • Сохраните ваш проект и сделайте перестройку.

Больше информации..

Бала Кумар
источник
3
Вся эта ошибка кажется совершенно случайной, но это решение помогло мне. Если кто-то еще зайдет так далеко, я могу только предложить попробовать все.
DeusExMachina25
6

В качестве обходного пути я попытался запустить Visual Studio 2010 в качестве администратора, и это сработало для меня.

Надеюсь, это поможет.

user350076
источник
Он почему-то перестал работать. Я не мог поверить, что это действительно решило проблему. Спасибо!!!
Герхард Пауэлл
4

Как первоначальный автор обхода сообщения об ошибке подключения, существует два варианта этого сообщения (я обнаружил позже)

Для одного варианта вы используете sn.exe (обычно, если вы используете сильные имена), чтобы импортировать ключ в хранилище сильных имен.

Другой вариант, для которого вы используете certmgr для импорта, это когда вы подписываете код для таких вещей, как одноразовое развертывание (обратите внимание, что вы можете использовать один и тот же сертификат для обеих целей).

Надеюсь это поможет.

Петери
источник
Да, мы также попробовали это с поддержкой Microsoft, и это - способ сделать импорт подписи кода. Проблема действительно заключается в том, что пароль сертификата теряется во время безопасной проверки источника процесса. Но это не похоже на настоящую проблему. Похоже, если вы введете данные сертификата на компьютере № 1 Widnows 7, а затем переместите этот же файл на другой компьютер и зарегистрируете его, регистрация будет работать, но сборка не удастся. Microsoft все еще изучает это для нас. На данный момент нам пришлось отключить подпись кода и подписывать вручную во время выпуска.
JasonD
3

У меня ничего не получалось, но потом я пошел и заглянул в диспетчер сертификатов (mmc.exe). Сертификат не был импортирован в личном хранилище, поэтому я импортировал его вручную, а затем проект скомпилирован.

См. Раздел « Подписывание манифеста ClickOnce и подпись со строгим именем сборки с использованием страницы подписи Visual Studio Project Designer», «Подписание сборок» .

Самуил
источник
Это решило проблему и после исправления SN.exe -i.
CodingSamurai
2

В этом нам поможет повторный выбор файла ключа в выпадающем списке и ввод пароля.

Но это необходимо делать каждый раз, когда файл ключа изменяется, и, похоже, он не в порядке.

user1113289
источник
2

У меня была такая же проблема после переноса моей установки Windows на SSD . Ни одно из других решений не помогло мне.

Моим решением было открыть файл проекта в блокноте и удалить все ссылки на ключи PFX. После сохранения файла откройте решение в Visual Studio. Перейти к проекту -> Свойства -> Подписание. Вы не должны видеть никаких ключей, перечисленных в поле со списком «выберите файл ключа строгого имени». В поле со списком перейдите к ключу, выберите его, и ваш проект теперь можно построить.

GoalMaker
источник
2

Моя проблема заключалась в том, что контроллер сборки TFS работал в качестве сетевой службы, и по какой-то причине я не понял, почему не использовались сертификаты службы сборки Visual Studio Build Host. Я изменил удостоверение службы Visual Studio Build на что-то более управляемое, убедился, что у него есть права на сервере TFS, и вручную добавил сертификаты с помощью MMC.

Проблема была также в том, что MSBuild не может добавить сертификаты, защищенные паролем, в хранилище.

часовой
источник
В каком магазине вам нужно добавить его в ??
felickz
Я сделал то же самое (и также поместил сертификаты в этот пользователь Personal / Trusted Root / Trusted Pub .. не уверен, что это исправило) и смог перейти к следующей ошибке TFS, в которой у меня были конфликтующие рабочие пространства, поэтому, чтобы исправить, что я также имел удалить и добавить новый агент сборки.
felickz
2

У меня была похожая проблема, но после выбора pfx в «ComboBox файла ключа строгого имени» и ввода пароля я все еще получал похожую ошибку (без части имени контейнера):

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

Также не была заполнена информационная панель сертификата «Подписать ClickOnce».

Я сделал «Выбрать из файла ...» на моем pfx, и это решило проблему.

сурфен
источник
1

Все методы, описанные здесь, мне не помогли. Но когда я удалил файл * .pfx из своего проекта и снова добавил его в подпись сборки, я создал свой проект без каких-либо ошибок! Я не могу объяснить причины, почему. Но это сработало для меня.

Петр Барбаняга
источник
1

Хорошо, это сработало для меня. Откройте старое решение / проект от имени администратора в Visual Studio 2010 и откройте новое или скопированное решение / проект. Как администратор, удалите скопированный файл pfk в новом решении / проекте Visual Studio 2010, перейдите в свойства проекта и отмените выбор.

Открыв оба проекта, скопируйте вставку в новый. Зайдите в свойства проекта и выберите Build. Я открыл и закрыл Visual Studio, а также после удаления из нового проекта собрал его перед тем, как скопировать из старого проекта и выбрать его. Сначала я получил ошибку в начале этого поста, когда скопировал проект и попытался его собрать.

Джейсон Робертсон
источник
1

В моем сценарии служба сборки не использовала ту же учетную запись пользователя, с которой я импортировал ключ sn.exe.

После смены учетной записи на мою учетную запись администратора все работает просто отлично.

Матиас Ликкегор Лоренцен
источник
У меня возникла та же проблема, прочитав ваш комментарий, я указал на тот факт, что я обновился до Windows 10 с Windows 7, и теперь VS должен быть запущен от имени администратора. Так что запускал VS как админ и без проблем ..
Спасибо
1

Это решило мою проблему: открой свой VS проект

Дважды щелкните на Package.appxmanifest

Перейти на вкладку Упаковка

нажмите выбрать сертификат

нажмите настроить сертификат

выберите из файла и используйте example.pfx, это единство или что-либо еще созданное

Милад Ксанди
источник
0

Я решил эту проблему для себя, изменив следующую строку в файле .csproj проекта Visual Studio:

Это выдало ошибку «невозможно импортировать»:

<PropertyGroup>
<SignManifests>true</SignManifests>
</PropertyGroup>

При изменении значения на false ошибка исчезла.

Кайл Жюль
источник
7
Обычно сборки подписываются по назначению, и удаление SignManifests может вызвать проблемы при развертывании в некоторых средах. Так что это не решение проблемы
Георгий Смирнов
0

Я получил ту же ошибку. В моем случае я попробовал все вышеперечисленное, но не смог получить результат.

Я наконец понял, что в моем случае причиной ошибки было то, что пароль сертификата не был введен или введен неправильно. Ошибка исчезла, когда я правильно и правильно ввел пароль. успешный

Хамит ЙИЛДИРИМ
источник
0

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

Поэтому я заново разработал sn.exe -i <infile> <container>команду в C #, используя RSACryptoServiceProvider . Исходный код и приложение находятся на GitHub в проекте SnInstallPfx .

Приложение SnInstallPfx принимает ключ PFX и его пароль. Он автоматически вычисляет имя контейнера ключей (VS_KEY_ *) (заимствовано из исходного кода MSBuild) и устанавливает его в CSP со строгим именем.

Применение:

SnInstallPfx.exe <pfx_infile> <pfx_password>
// or pass a container name if the default is not what you need (e.g. C++)
SnInstallPfx.exe <pfx_infile> <pfx_password> <container_name>
Honzajscz
источник
0

Для кого используются бегуны GitLab:

  • Обязательно запустите бегун с учетной записью, в которую вы можете войти: ./gitlab-runner.exe install --user ".\ENTER-YOUR-USERNAME" --password "ENTER-YOUR-PASSWORD"(мне пришлось сначала остановиться и удалить)
  • следуйте этому руководству, чтобы предоставить пользователю сборки разрешение войти в систему как сервис
  • войти с таким пользователем сборки
  • используйте команду, предложенную в других ответах: sn -i certificate.pfx VS_KEY_C***6

имя контейнера предлагается в выводе задания с ошибками на GitLab (вывод msbuild) введите описание изображения здесь

Мишель Мпп Маростика
источник