Подтвердить что ты не робот

"Явная подпись XML недопустима" на клиентской машине, но отлично работает на компьютере разработчика

На работе у нас было приложение ClickOnce, которое, когда клиент попытается установить, выбрасывает исключение:

  • Показатель чтения исключений из файла:/FILEPATH: манифест может быть недействительным или файл не может быть открыт.

    Явная подпись XML недопустима.

    SignatureDescription не может быть создана для поставляемого алгоритма подписи.

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

Но мы не можем понять, почему это будет работать для установки приложения на машинах разработчиков (даже разработчиков, которые не работали с приложением), но это не сработает для машин клиентов?

У нас мало информации о том, как создавались сертификаты или пакет ClickOnce, потому что человек, который его сделал, ушел и не оставил документацию об этом.

В используемом сертификате не было пароля, и у обычных пользователей нет прав администратора.

Из вопроса Недопустимая подпись XML манифеста, я мог догадаться, что проблема может заключаться в том, что они создали проект и сертификат с помощью .NET Framework 4.5, а затем, когда они устанавливают приложение для работы с .NET Framework 4.0, они не изменяют алгоритм подписи. Но тогда я хотел бы, чтобы он не работал и для разработчиков.

Любое понимание, которое вы могли бы мне дать, было бы весьма признательно.

4b9b3361

Ответ 1

Обновление: это исправлено с обновлением Visual Studio 2013 3. Попробуйте опубликовать свое приложение с этой версии VS или более поздней версии.

Предыдущий ответ:

Это потому, что на вашем компьютере разработчика был установлен .NET 4.5, а на клиентских компьютерах был установлен только .NET 4.0. Клиентские компьютеры .NET 4.0 не могут прочитать манифест, поскольку они ожидают SHA-1, в то время как машины разработчика .NET 4.5 могут.

Смотрите этот пост в блоге для получения дополнительного контекста.

Это изменение связано с тем, что мы прекратили использовать устаревшие сертификаты по умолчанию (SHA-1) в NetFX4.5 для подписывания манифеста и вместо этого использовать более новую версию (SHA-256), которая не распознается NetFx4.0 во время выполнения. Поэтому, анализируя манифест, 4.0 runtime жалуется на недопустимый манифест. Для устаревших фреймворков, когда мы пытаемся запустить приложение ClickOnce в поле, которое не имеет целевой среды выполнения, ClickOnce выводит сообщение пользователю: "вам нужно xxxx.xx runtime для запуска этого приложения". Но начиная .NET 4.5, если приложение 4.5 ClickOnce запускается в ящике с установленным только .NET 4.0, сообщение жалуется на недопустимый манифест. Чтобы решить проблему, вы должны установить .NET Framework 4.5 в целевую систему.

Попробуйте подписать манифест с сертификатом SHA-1 вместо сертификата SHA-2.

Ответ 2

У нас была аналогичная проблема - у нас есть приложение .NET 4.0, предназначенное для работы на машинах с .NET 4.0 или выше. По мере того как наш сертификат подписания кода истек, мы купили новый, и поскольку Sha1 будет лишен, мы получили Sha256. Я должен сказать, что на нашей машине для сборки установлен .NET 4.5, поэтому сборки фреймворков обновлены на этой машине.

Мы заметили, что следующая ошибка начала появляться только на компьютерах .NET 4.0 после переноса в новый сертификат:

* Activation of http://localhost/publish/Test.application resulted in exception. Following failure messages were detected:
    + Exception reading manifest from http://localhost/publish/Test.application: the manifest may not be valid or the file could not be opened.
    + Manifest XML signature is not valid.
    + SignatureDescription could not be created for the signature algorithm supplied.

После небольшого исследования fe выяснил эту тему и некоторые другие, предлагая обновить до .NET 4.5, но это не работает для нас - мы не хотим заставить наших клиентов обновлять .NET framework (~ 20% все еще используют .NET 4.0). Вот решения, которые мы придумали:

  • Подпишите манифесты на машине, на которой установлен только .NET 4.0
  • Войдите в следующий PowerShell script вместо использования mage.exe:
function SignFile($filePath, $timeStampUri, $certThumbprint)
{
    #Add-Type System.Security

    $x509Store = New-Object -TypeName ([System.Security.Cryptography.X509Certificates.X509Store]) -ArgumentList ([System.Security.Cryptography.X509Certificates.StoreName]::My),([System.Security.Cryptography.X509Certificates.StoreLocation]::CurrentUser)
    try
    {
        $x509Store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadOnly)
        $x509Certificate2Collection = $x509Store.Certificates.Find([System.Security.Cryptography.X509Certificates.X509FindType]::FindByThumbprint, $certThumbprint, $false);
        if ($x509Certificate2Collection.Count -eq 1)
        {
            $cert = [System.Security.Cryptography.X509Certificates.X509Certificate2]@($x509Certificate2Collection)[0]

            # This will force using of SHA1 instead of SHA256
            $cert.SignatureAlgorithm.FriendlyName = ""

            Add-Type -AssemblyName "Microsoft.Build.Tasks.v4.0"

            [Microsoft.Build.Tasks.Deployment.ManifestUtilities.SecurityUtilities]::SignFile($cert, $timeStampUri, $filePath)
        }
    }
    finally
    {
        $x509Store.Close();
    }
}

РЕДАКТИРОВАТЬ: Я действительно использую эту команду, чтобы подписать файлы манифеста: https://gist.github.com/nedyalkov/a563dd4fb04d21cb91dc

Надеемся, что эта информация сэкономит время и силы кому-то!

Ответ 3

Мы также столкнулись с аналогичной проблемой в следующем сценарии.

Мы просто перенесли с vs2008 на vs2013-update 5.

Наше приложение clickonce находится на .net 3.5.

После этого наша команда clickonce build с использованием nant script в командной строке выдавала ту же ошибку "Явная подпись XML недействительна" на машине с версией каркаса .net старше 4.5.

Поскольку мы использовали vs2013-update 5, он явно не был связан с исправлением, сделанным в vs2013-update 3.

После проб и ошибок в одном примере приложения мы отсортировали его с помощью mage.exe, который мы используем, чтобы отменить манифест после обновления манифеста. Когда мы создаем настройку с помощью командной строки разработчика VS2013, она использует файл mage.exe, который установлен с VS2013, и он не имеет того же исправления, которое выполняется в обновлении VS2013. 3. Используя старый файл mage.exe, установленный с vs2008 (обычно расположенный в папке "C:\Program Files (x86)\Microsoft SDK\Windows\v7.0A\Bin" ) решили нашу проблему.