VS2012 .NET 4.0 Clickonce VSTO CryptographicException: SignatureDescription не может быть создано для предоставленного алгоритма подписи

У меня есть VS2010 .NET 4.0 VSTO Outlook Addin проект, который я хочу перенести на VS2012 (но оставить его в .NET 4.0). Он прекрасно компилируется и прекрасно работает внутри IDE, но когда я пытаюсь запустить опубликованный установщик ClickOnce, я получаю следующее исключение:

System.Deployment.Application.InvalidDeploymentException: Exception reading manifest from file://MyPath/MyAddIn.vsto: the manifest may not be valid or the file could not be opened. ---> System.Deployment.Application.InvalidDeploymentException: Manifest XML signature is not valid. ---> System.Security.Cryptography.CryptographicException: SignatureDescription could not be created for the signature algorithm supplied.

На основании моих тестов и онлайн-исследований (Вот а такжетам), похоже, что только установив VS2012 на мою машину (независимо от того, публикую я из VS2010 или VS2012) установщик ClickOnce заставитrequire сертификат SHA1 при использовании .NET 4.0. Мой существующий сертификат SHA256 прекрасно работает с .NET 4.0 при компиляции с использованием VS2010 (without VS2012 установлен).

I can't upgrade clients to .NET 4.5 because this is a VSTO40 project (runs on XP/Office 2007). I can't uninstall VS2012/.NET 4.5 on local machine because I have other projects that need it. I can't easily downgrade my certificate from SHA256 to SHA1.

Есть ли другие предложения, которые позволили бы мне двигаться вперед?

Ответы на вопрос(4)

чистой конечной машине Windows 7 у меня «SignatureDescription не может быть создано для поставляемого алгоритма подписи». Исключение. Проблема решена после установки .Net Framework 4.5 на машине развертывания.

 25 авг. 2012 г., 22:43
Нашел этот полезный блогblogs.msdn.com/b/smondal/archive/2012/08/24/…
 Lee Grissom21 авг. 2012 г., 20:07
Интересно, что вы говорите, что вам пришлось "установить" .NET 4.5, тогда как мне пришлось «удалить» .NET 4.5.
 Lee Grissom22 авг. 2012 г., 18:29
О, я вижу. Я думал, что вы говорите о своей сборочной машине. Моя проблема возникла на этапе вызова ClickOnce. Я не компилирую с .NET 4.5, потому что мои пользователи все еще используют Windows XP. Но они должны быть обновлены до конца года. :)
 22 авг. 2012 г., 05:47
Да, я должен был установить .net 4.5 на машине развертывания (клиент). Я думаю, что .net 4.5 имеет другой способ проверить подпись манифеста clickonce. Если я опубликую приложение без подписи, все работает нормально, даже без установки .net 4.5 на машине развертывания (клиент).
 23 авг. 2012 г., 09:52
Я компилирую свои приложения с помощью .NET 4.0. Я "временный" решено для моих пользователей XP удаление подписи манифеста перед публикацией
Решение Вопроса

создав новый сертификат, который используется для подписи манифеста ClickOnce, и сгенерировал его с помощью алгоритма SHA1. Вы можете увидеть разговор здесь:http://social.msdn.microsoft.com/Forums/en-US/winformssetup/thread/eba424ae-f7b7-4530-bb68-db3b9972a31e

Edit 2014-Aug-05:
Visual Studio 2013 Update 3, наконец, исправляет эту проблему.
http://support.microsoft.com/kb/2933779
ОтFixed Issues -> General:

You can use SHA 256 code-signing certificates even for applications that target the .NET Framework 4.0 or an earlier version. Before this update, the .NET Framework 4.5 had to be present on the client computer when a SHA 256 code-signing certificate was used for desktop applications published with ClickOnce or Visual Studio Tools for Office add-ins. If you have used SHA 256 code-signing certificates in the past, and have seen errors such as "The application is improperly formatted," "The manifest may not be valid," "Manifest XML signature is not valid," or "SignatureDescription could not be created for the signature algorithm supplied," this update resolves the problem for re-published and newly-published applications.

и я использовал VS 2013, .NET 4.5 и все правильно подписывал с помощью SHA256.

Наконец, я обнаружил, что была установлена более старая версия VSTO 2010 Runtime (10.0.40303). Как только мы обновили его до10.0.40820 все работало нормально. Очень надеюсь, что это кому-то поможет, несколько дней сводил меня с ума, пытаясь понять, что происходит.

 Lee Grissom21 дек. 2013 г., 02:29
Хорошая находка! У меня установлена более старая версия (и развернута на всех моих клиентах). В следующий раз я попытаюсь вернуться к сертификату SHA256 и использовать более новую VSTO Runtime и посмотреть, сработает ли это. Спасибо!
 04 окт. 2017 г., 16:07
@ Брайан, я действительно в долгу перед тобой. Это должен быть принятый ответ. СПАСИБО
 30 июн. 2015 г., 10:44
Отличный ответ. Это решило мою проблему.
 11 апр. 2014 г., 03:06
Примечание. Сегодня вышла более новая версия VSTO Runtime, в которой решен вопрос «Неизвестный издатель». проблема, которую вы могли бы видеть с вашим сертификатом SHA256.blogs.msdn.com/b/vsto/archive/2014/04/10/…
 03 дек. 2014 г., 16:11
Спасибо Майкл, это выручило меня после борьбы с этим в течение дня.

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

Я столкнулся с этим с проектом VSTO, когда публиковал в Visual Studio 2015, нацеливался на .Net 4.5 и работал на клиентском компьютере с .Net 4.5. Теоретически я не должен видеть ошибку, но обнаружил, что манифест приложения (* .dll.manifest) все еще указывает .Net 4.0. Он будет корректно работать при первом связывании, которое было выполнено после входа в систему, но после этого будет происходить сбой каждый раз после этого.

<dependency>
  <dependentAssembly dependencyType="preRequisite" allowDelayedBinding="true">
    <assemblyIdentity name="Microsoft.Windows.CommonLanguageRuntime" version="4.0.30319.0" />
  </dependentAssembly>
</dependency>

Насколько я могу судить, версия для .Net 4.5 - 4.0.30319.18020, поэтому я вставил ее вместо.

<dependency>
  <dependentAssembly dependencyType="preRequisite" allowDelayedBinding="true">
    <assemblyIdentity name="Microsoft.Windows.CommonLanguageRuntime" version="4.0.30319.18020" />
  </dependentAssembly>
</dependency>

Затем мне пришлось заново подписать манифесты приложения и развертывания (* .vsto). УвидетьПодписание и повторная подпись манифестов в ClickOnce, Вот скрипт PowerShell, который я использовал для этого. Это заканчиваетсяApplication Files\<applic,ation>_<version>\ папка.

# get files only, no directories
$withDeploy = ls -Recurse | where Mode -eq "------" | where Name -Like "*.deploy"

if ($withDeploy.Length -gt 0)
{
    # rename .deploy files
    $withDeploy | %{ Rename-Item -Path $_.FullName -NewName $_.FullName.Replace(".deploy", "") }

    $certPath = "Z:\path\to\your\cert\file"
    $certFile = "$certPath\cert.p12"
    $certPass = "<your_password>"

    # re-sign the application manifest; should be <application>*.dll.manifest
    $manifestFile = ls | where Name -like "*.dll.manifest" | %{ return $_.Name }
    mage -Update $manifestFile -CertFile $certFile -Password $certPass

    # re-sign the deployment manifest; *.vsto
    $vstoFile = ls | where Name -like "*.vsto" | %{ return $_.FullName }
    #mage -Update $vstoFile -AppManifest $manifestFile -CertFile $certFile -Password $certPass

    $otherVstoFile = ls "..\..\" | where Name -like "*.vsto" | %{ return $_.FullName }
    mage -Update $otherVstoFile -AppManifest $manifestFile -CertFile $certFile -Password $certPass
    Copy-Item $otherVstoFile $vstoFile

    # put .deploy back
    $withDeploy | %{ Rename-Item -Path $_.FullName.Replace(".deploy", "") -NewName $_.FullName }
}

В идеале было бы предпочтительнее внести изменения в проект Visual Studio, чтобы мне не приходилось делать это каждый раз, когда я публикую, но я не вижу способа сделать это, и любое решение лучше, чем никакого решения. Я мог бы добавить это как действие MSBuild после публикации или что-то еще, но сейчас это работает.

Ваш ответ на вопрос