Неможливо імпортувати файл ключів "blah.pfx" - помилка "Файл ключа може бути захищений паролем"


392

Ми просто модернізували наші проекти Visual Studio 2008 до Visual Studio 2010. Усі наші збори були підписані чітко за допомогою сертифікату підпису коду Verisign . Після оновлення ми постійно отримуємо таку помилку:

Неможливо імпортувати такий ключовий файл: companyname.pfx. Файл ключів може бути захищений паролем. Щоб виправити це, спробуйте імпортувати сертифікат ще раз або вручну встановити сертифікат на CSP з сильним ім'ям із таким ключовим ім'ям контейнера: VS_KEY_3E185446540E7F7A

Це відбувається на деяких машинах розробників, а не на інших. Деякі методи, що використовуються для виправлення цього, які працювали деякий час, включають:

  • Повторна інсталяція файла ключа з Провідника Windows (клацніть правою кнопкою миші на файл PFX та натисніть кнопку Встановити)
  • Установка Visual Studio 2010 на свіжу машину вперше запропонує ввести пароль при першому відкритті проекту, а потім він працює. На машинах, оновлених від Visual Studio 2008, ця опція не доступна.

Я намагався за допомогою утиліти SN.EXE (Strong Name Tool) зареєструвати ключ за допомогою CSP Strong Name, як підказує повідомлення про помилку, але щоразу, коли я запускаю інструмент з будь-якими параметрами, використовуючи версію, що постачається з Visual Studio 2010, SN .EXE просто перераховує аргументи командного рядка, а не робити нічого. Це відбувається незалежно від того, які аргументи я надаю.

Чому це відбувається і які чіткі кроки, щоб виправити це? Я збираюся відмовитися від встановлення ClickOnce та підписання коду Microsoft.

Відповіді:


447

Я також стикався з цією проблемою. Мені вдалося вирішити проблему, запустивши
sn -i <KeyFile> <ContainerName>( встановлює пару ключів у названий контейнер ).

snзазвичай встановлюється як частина SDK для Windows. Наприклад 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-файл від провідника рішень і вибрати Open Command Prompt, який запустить інструмент підключення .net 2010 cmd у правильний каталог.

Перш ніж запустити цю команду sn, я перевстановив pfx, клацнувши правою кнопкою миші та вибравши встановити, проте це не спрацювало. Просто щось зауважимо, оскільки це може бути поєднанням того, що надало рішення.

Сподіваюся, це допоможе вирішити вашу проблему.


5
Дякую Брендону - так, подібно до того, як ручна повторна інсталяція ключового файлу "роду" вирішує проблему. Проблема полягає в тому, що як тільки ви зареєструєтесь у файлі ключів, будь-які інші користувачі, які отримали останню інформацію про цей зареєстрований у ключовому файлі, тепер отримають цю помилку. Якщо хтось із цих користувачів перевіряє їхнє "виправлення", і я отримую останню інформацію, то моя машина зараз знову зламана ... і так далі. Корпорація Майкрософт розпочала проблему та призначила її команді VS2010 та команді VSS.
JasonD

2
Цікаво. Я не стикався з цією проблемою, додаючи pfx до нової CSP. Наскільки мені відомо, SN -i не змінює файл pfx, тому вам не потрібно нічого потім перевіряти. Однак якщо ви все-таки змінили файл pfx, як-от скидання пароля, це спричинить проблему, оскільки змінить файл pfx. Чи створюється ваше рішення за допомогою цього файлу pfx з будь-якої іншої машини? Якщо так, то файл pfx правильний, просто не встановлено правильну CSP на вашій машині, яка має проблеми зі збиранням.
Брендон Манчестер

3
Спочатку я спробував лише частину sn -i, але він скаржився на те, що пароль був невірним (хоча він був правильним). Я видалив сертифікат, перевстановив його, а потім sn -i ... спрацював. В основному підтверджуючи, що для мене були потрібні обидва кроки. Перевстановіть cert та виконайте команду sn.
Dodgyrabbit

1
Як у VSS, так і в TFS я виявив, що якщо ви запускаєте команду sn -i, вона не працює, якщо ви не перевірили файл PFX, і коли ви перевіряєте її, вона не працює для інших розробників у мережі. Мені доведеться спробувати перевстановити cert, після чого запустіть команду sn -i. Він потрібен для роботи над усіма розробниками в офісі.
JasonD

5
Це працювало і для мене, проте мені раніше цього не доводилося робити. VS використовувався для того, щоб просто вискакувати і запитувати пароль для кожного ключа. Що змінилося?
Кевін Беррідж

126

Я виявив виправлення, яке допомагає вам успішно будувати в середовищі для кількох розробників:

Замість зміни пароля (внаслідок чого .pfx буде змінено), виберіть файл .pfx зі списку. Потім виклик діалогового вікна пароля. Після введення пароля проект буде складено ОК. Кожен розробник може це зробити на своїй локальній машині, фактично не змінюючи файл .pfx.

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


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.


1
Дякую!! Я думаю, що це працювало для мене. Я схопив openssl тут: gnuwin32.sourceforge.net/packages/openssl.htm
aherrick

Я хотів би додати можливість включити фактичний сертифікат у pfx: openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in сертифікат.crt -certfile CACert.crt -keysig -keyex
Піт

Не забудьте запустити openssl як адміністратор, інакше ви отримаєте помилку "не в змозі записати" випадковий стан "" Також: мені все-таки довелося відповісти Брендона Манчестера із справою "sn -i ..." після виконання openssl річ.
Лі Річардсон


Це єдине рішення, яке нарешті спрацювало мене. Дякую!
Ладислав

37

Я говорив занадто рано! Поновлення повернуло помилки до гри ...

Я знайшов це працює - клацніть правою кнопкою миші в Провіднику рішень і виключіть його з проекту. Клацніть Показати всі файли , клацніть правою кнопкою миші та тепер знову включіть її до проекту. Тепер скасувати очікування змін ...

Чомусь це розібралося для мене і було відносно безболісним!


Повернувши це назад, не допомогло. Не зрозумів, що видалив pfx з налаштувань проекту. Я думаю , що брехня відповіді у відповідь від Stefan stackoverflow.com/a/14644793/1735721
DennisWelu

Ця відповідь чудова. Це працювало для мене, і це так просто.
Бен Рубін

Працював для мене (VS2017 15.7.4). Дякую за приємне та швидке рішення.
Учасник зустрічі

Працював для мене на VS2019 16.1.3. Дякую!!
JordanTDN

35

Я виявив, що в деяких випадках слід спробувати видалити цей ключ перед його встановленням. Тому виконайте наступне:

  1. sn -d VS_XXXX
  2. sn -i mykey.pfx VS_XXX

1
Це зафіксувало це для мене! Сама установка виявилася невдалою, оскільки об'єкт вже існує.
Енді

Я теж спробував це, і це не допомогло. Може щось не так з самим сертифікатом?
Томаш Зато - Відновіть Моніку

2
Дякую, вилучення має бути виконано як адміністратор - якщо запустити звичайного користувача, помилкова помилка "Сильний контейнер ключа імені не знайдено".
astrowalker

Дякую Його роботі для мене.
Рікін Патель

31

VSCommands 2010 (плагін для Visual Studio) може виправити це автоматично для вас - просто натисніть на помилку правою кнопкою миші та натисніть кнопку Застосувати виправлення в меню. Ви можете отримати його з галереї Visual Studio .


1
Я вважаю, що це стосується професійної версії - не майте цього варіанту в моїй легкій версії
Адам Батлер

2
Я тільки що завантажив версію (вересень 2011 року) з цією опцією.
Джим вважає

4
Це як і раніше вимагає професійної ліцензії.
Джон Бафман

27

Перепробувавши всі ці рішення (і багато іншого), я виявив, що проблема полягає десь в іншому місці. Для людей, які переживають ті ж нещастя, що і я, після придбання сертифіката, я поділюсь вирішенням своєї проблеми.

Поведінка

Я розумію, що "знак" застосовує сильне ім'я, а не автентичний код до DLL або EXE. Ось чому signtool буде працювати в цьому випадку, але "підписати" у Visual studio не вийде.

Причина

У минулому я мав досвід отримання сертифікатів від Verisign. Вони мають KeySpec=2сертифікат, який використовується з функцією 'знак' у Visual Studio. Ці сертифікати чудово працюють як для Visual Studio, так і для signtool.

Зараз я купив у Comodo сертифікати, які мають неправильні KeySpec=1сертифікати підпису коду. Це означає, що ці сертифікати чудово працюють з signtool (authentode), але не з сильним іменуванням (випадаючий знак).

Рішення

Вирішити це питання можна двома способами:

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

Оскільки я хочу використовувати кілька сильних імен, в даний час я використовую варіант (1), хоча варіант (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 знову.


Ваше рішення №2 було єдиним, що працювало для мене (без використання вторинного інструменту командного рядка чи процесу) Дякую
Брон Девіс

1
Так, я справді не розумію, чому деякі рішення мають стільки голосів; це справді єдине, що працювало на мене, і я впевнений, що у більшості людей, які купують сертифікат CS, має бути однаковий випуск. Ну добре ...
атлас

1
Це єдине для мене рішення. Також файл .pfx не може містити інформацію ланцюжка сертифікатів для складання підписів.
Ши-Вень Су

Дякую за таку детальну інструкцію. Кожен крок описаний точно.
Дмитро

1
Ваше перше рішення є критичним для розуміння тут: абсолютно не потрібно складати монтажні збірки з дорогим захищеним паролем сертифікатом! Після того, як ви це зрозумієте і просто скористаєтеся snk-файлом, ця проблема повністю усувається. Дивіться попереджувальну записку тут і тут .
Павло

11

Щоб вирішити цю проблему у Visual Studio 2012, я клацніть правою кнопкою миші проект, властивості -> "підписання" та зніміть прапорець "Підписати маніфести ClickOnce".


2
Це ідеальна відповідь, якщо немає необхідності в підписанні. Це усуне необхідність підписання проекту.
Том Андерсон

8

Я переобрав файл Key (pfx) у спадному вікні "Виберіть файл із ключовим ім'ям сильного імені", а потім вказав пароль у спливаючому вікні "Введення пароля". Зберегли мій проект і відновити його.

  • Відкрийте властивості проекту.
  • Клацніть на розділі Підписання.
  • Там, де написано "Виберіть міцний файл імені ключа:", виберіть поточне значення зі спадного поля:

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

  • Тепер Visual Studio запропонує вам пароль. Введіть його.

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

  • Збережіть свій проект і виконайте перебудову.

  • Якщо ви отримаєте повідомлення про помилку: "Була здійснена спроба посилання на маркер, який не існує", просто проігноруйте його та продовжуйте дії, описані нижче

  • Натисніть кнопку "Змінити пароль":

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

  • Введіть оригінальний пароль у всі три поля та натисніть кнопку ОК. Якщо ви хочете змінити свій пароль (або якщо ваш старий пароль не відповідає вимогам складності), ви можете зробити це зараз.

  • Збережіть свій проект і виконайте перебудову.

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


3
Ця ця помилка здається вирішити цілком випадково, але це рішення працювало для мене. Якщо хтось потрапить так далеко на сторінку, я можу лише запропонувати спробувати все.
DeusExMachina25

6

Як вирішення, я спробував запустити Visual Studio 2010 як адміністратор, і це працювало на мене.

Я сподіваюся, що це допомагає.


Це чомусь перестало працювати. Я не міг повірити, що це насправді вирішило питання. Дякую!!!
Герхард Пауелл

4

Як оригінальний автор роботи над звітом про помилку підключення, є два варіанти цього повідомлення (я виявив пізніше)

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

Інший варіант, для якого ви використовуєте certmgr для імпорту, - це коли ви кодируєте такі речі, як розгортання клацання один раз (зверніть увагу, ви можете використовувати один і той же сертифікат для обох цілей).

Сподіваюсь, це допомагає.


Так, ми також спробували цю програму з підтримкою Microsoft, і це спосіб імпорту підписання коду. Проблема, здається, полягає в тому, що пароль сертифіката втрачається під час безпечного джерела процесу перевірки. Але це не виглядає справжньою проблемою. Схоже, якщо ви введете дані сертифіката на машині №1 Widnows 7, а потім перенесіть такий самий файл на іншу машину і зареєструєте його, реєстрація працюватиме, але збірка не вдасться. Microsoft все ще розглядає це для нас. Наразі нам довелося вимкнути підпис коду та підписати вручну під час випуску.
ДжейсонД

3

Нічого не працювало для мене, але потім я пішов і заглянув до менеджера сертифікатів (mmc.exe). Сертифікат не був імпортований в особистому магазині, тому я імпортував його вручну, а потім проект склав.

Див. Розділ Підписування маніфесту ClickOnce та підписання сильних імен за допомогою сторінки підпису дизайнера проекту Visual Studio, Складання підписів .


Це вирішило і для мене проблему після виправлення SN.exe -i.
CodingSamurai

2

Для цього нам допомагає повторний вибір ключового файлу в коробці і введення пароля.

Але це потрібно робити щоразу, коли змінюється файл ключа, і, здається, це не все в порядку.


2

У мене була така ж проблема після переміщення інсталяції Windows на SSD . Жодне з інших рішень для мене не працювало.

Моє рішення було відкрити файл проекту в Блокноті та видалити всі посилання на ключі PFX. Після збереження файлу відкрийте рішення в Visual Studio. Перейдіть до проекту -> Властивості -> Підписання. Ви не повинні бачити жодних клавіш, перелічених у вікні "Вибрати файл із сильним ім'ям". У вікні комбінації перейдіть до ключа, виберіть його, і ваш проект тепер може бути побудований.


2

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

Проблема полягала також у тому, що MSBuild не може додати до магазину захищені паролем сертифікати.


У який магазин потрібно додати його ??
felickz

Я зробив те саме (і також поставив certs у цих користувачів Personal / Trusted Root / Trusted Pub .. не впевнений, що це виправив) і зміг перейти до наступної помилки TFS, що у мене були суперечливі робочі простори, щоб виправити, що я також мав щоб видалити та додати новий збірний агент.
felickz

2

У мене була аналогічна проблема, але після вибору pfx у файлі "Сильний файл ключа імені" ComboBox та введення пароля я все-таки отримав подібну помилку (без частини імені контейнера):

Неможливо імпортувати такий ключовий файл: companyname.pfx. Файл ключів може бути захищений паролем. Щоб виправити це, спробуйте імпортувати сертифікат ще раз або встановити сертифікат вручну

Також панель інформації про сертифікати "Підписати маніфести ClickOnce" не була заповнена.

Я зробив "Select from File ..." на своєму pfx, і це вирішило проблему.


1

Усі описані тут методи мені не допомогли. Але коли я видалив файл * .pfx зі свого проекту та додав його до підписання асамблеї знову, я створив свій проект без жодної помилки! Я не можу пояснити причини. Але це працювало на мене.


1

Гаразд, це працювало для мене. Відкрийте старе рішення / проект як адміністратор у Visual Studio 2010 та відкрийте нове або скопійоване рішення / проект. Як адміністратор, видаліть скопійований файл pfk у новому рішенні / проекті Visual Studio 2010 та перейдіть до властивостей проекту та зніміть його з вибору.

Коли обидва проекти відкриті, скопіюйте пасту на новий. Перейдіть до властивостей проекту та виберіть «Створити». Я відкрив і закрив 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>

Зміна значення на помилкове призвело до помилки.


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>

0

Для кого використовуються бігуни GitLab:

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

ім'я контейнера пропонується у невдалому виході роботи на GitLab (msbuild вихід) введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.