24

在工作中,我们有一个 ClickOnce 应用程序,当客户端尝试安装时,它会抛出异常:

  • 从 file:/FILEPATH 读取清单时出现异常:清单可能无效或无法打开文件。

    清单 XML 签名无效。

    无法为提供的签名算法创建 SignatureDescription。

为了解决这个问题,我们最终使用了另一个证书文件,它运行良好(重新签署了清单)。

但是我们无法理解为什么将应用程序安装在开发人员的机器上(即使是没有使用应用程序的开发人员)会起作用,但对客户的机器却不起作用?

我们没有太多关于如何创建证书或 ClickOnce 包的信息,因为执行它的人已经离开并且没有留下有关它的文档。

正在使用的证书没有密码,普通用户没有管理员权限。

从 Stack Overflow 问题Manifest XML signature is not valid,我可以猜测问题可能是他们使用.NET Framework 4.5 创建了项目和证书,然后当他们将应用程序设置为使用 .NET Framework 4.0 运行时,他们没有更改签名算法。但是我认为它也不应该对开发人员起作用。

您能给我的任何见解将不胜感激。

4

3 回答 3

26

Update: This is fixed as of Visual Studio 2013 Update 3. Try publishing your app from that version of VS or later.

Previous answer:

It's because your developer machine had .NET 4.5 installed, while your client machines only had .NET 4.0 installed. The .NET 4.0 client machines can't read the manifest, as they expect SHA-1, while the .NET 4.5 developer machines can.

See this blog post for some additional context.

This change is due to the fact that we stopped using legacy certificates as default (SHA-1) in NetFX4.5 to sign manifest and instead, use newer version (SHA-256), which is not recognized by NetFx4.0 runtime. Therefore, while parsing the manifest, 4.0 runtime complains of an invalid manifest. For legacy frameworks, when we try to run a ClickOnce app on a box that does not have targeted runtime, ClickOnce pops up a message to user saying “you need xxxx.xx runtime to run this app”. But starting .NET 4.5, if a 4.5 ClickOnce app is run on the box with only .NET 4.0 installed, the message complains about an invalid manifest. In order to resolve the issue, you must install .Net Framework 4.5 on the target system.

Try signing your manifest with a SHA-1 certificate instead of a SHA-2 certificate.

于 2013-05-16T05:22:39.643 回答
13

我们遇到了类似的问题 - 我们有一个 .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 框架(约 20% 仍在使用.NET 4.0)。以下是我们提出的解决方案:

  • 在仅安装了 .NET 4.0 的机器上签署清单
  • 使用以下 PowerShell 脚本而不是使用 mage.exe 进行签名:
函数签名文件($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)
    尝试
    {
        $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]

            # 这将强制使用 SHA1 而不是 SHA256
            $cert.SignatureAlgorithm.FriendlyName = ""

            添加类型-AssemblyName“Microsoft.Build.Tasks.v4.0”

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

编辑:我实际上使用这个命令来签署清单文件: https ://gist.github.com/nedyalkov/a563dd4fb04d21cb91dc

希望这些信息能为某人节省时间和精力!

于 2014-01-13T21:58:34.157 回答
0

在以下情况下,我们也遇到了类似的问题。

我们只是简单地从 vs2008 迁移到 vs2013-update 5。

我们的 clickonce 应用程序位于 .net 3.5 上。

在此之后,我们在命令提示符下使用 nant 脚本构建的 clickonce 应用程序在 .net 框架版本早于 4.5 的机器上给出了相同的错误“Manifest XML signature is not valid”。

由于我们使用的是 vs2013-update 5,它显然与 vs2013-update 3 中的修复无关。

在对一个示例应用程序进行反复试验后,我们整理出了我们用来在更新清单后重新签署清单的 mage.exe。当我们使用 VS2013 开发人员命令提示符创建设置时,它使用与 VS2013 一起安装的 mage.exe,它没有在 VS2013 更新 3 中完成的相同修复。使用旧的 mage.exe,与 vs2008 一起安装(通常位于“ C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin") 解决了我们的问题。

于 2016-03-14T06:01:00.820 回答