【问题标题】:"Manifest XML signature is not valid" on client machine but works fine on developer computer客户端计算机上的“清单 XML 签名无效”但在开发人员计算机上工作正常
【发布时间】:2013-05-15 19:53:43
【问题描述】:

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

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

    清单 XML 签名无效。

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

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

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

我们没有太多关于如何创建证书或 ClickOnce 包的信息,因为创建证书的人已经走了,也没有留下有关它的文档。

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

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

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

【问题讨论】:

  • 愚蠢的问题,但是有问题的机器可以使用错误消息中指定的相同路径打开文件吗?
  • 是的,一切都可以访问。更重要的是,我刚刚编辑了包并使用了另一个证书,所以一切都在同一个地方,但使用了另一个证书。它在有问题的计算机上工作。

标签: clickonce


【解决方案1】:

更新:自 Visual Studio 2013 Update 3 起已修复此问题。尝试从该版本的 VS 或更高版本发布您的应用。

上一个答案:

这是因为您的开发人员计算机安装了 .NET 4.5,而您的客户端计算机仅安装了 .NET 4.0。 .NET 4.0 客户端机器无法读取清单,因为它们期望 SHA-1,而 .NET 4.5 开发人员机器可以。

请参阅this blog post 了解更多上下文。

此更改是由于我们在 NetFX4.5 中停止使用旧证书作为默认 (SHA-1) 来签署清单,而是使用 NetFx4.0 无法识别的较新版本 (SHA-256)运行。因此,在解析清单时,4.0 运行时会抱怨清单无效。对于遗留框架,当我们尝试在没有目标运行时的盒子上运行 ClickOnce 应用程序时,ClickOnce 会向用户弹出一条消息,说“你需要 xxxx.xx 运行时来运行这个应用程序”。但从 .NET 4.5 开始,如果在仅安装 .NET 4.0 的盒子上运行 4.5 ClickOnce 应用程序,则消息会抱怨清单无效。要解决此问题,您必须在目标系统上安装 .Net Framework 4.5。

尝试使用 SHA-1 证书而不是 SHA-2 证书对清单进行签名。

【讨论】:

  • +1 但是该死的 MS,如果因为它是 2k3 服务器而无法安装 4.5 怎么办?如果您无法安装运行时的早期版本,那么有什么意义呢?
  • 是的,我也觉得很奇怪。据我了解,您只需要使用 SHA-1 证书即可。
  • 如果您想在答案中添加说明,解决方案是在 VS2010 中打开您的项目,转到项目属性并选择签名,然后“创建测试证书”。这将使用 SHA1 生成一个,并且似乎不会更改项目中的任何其他内容。
  • 在下面查看我的答案。从 Visual Studio 2013 Update 3 RC 开始,该问题已得到解决。
  • 这不可能——我们在安装了 .NET 4.5 Framework 的机器上看到了同样的问题——证书是 SHA-2,它是 Windows 7——我们降级回SHA-1,问题就消失了。
【解决方案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 框架(~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

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

【讨论】:

  • 接受的答案不建议更新到 4.5,这只是报价。解决方案是使用 SHA-1 签名。
  • 是的,你是对的。我混合了引用和答案。无论如何,与 Sha1 签约并不总是一种选择,因为建议今年过时。这也是我们的情况——我们已经购买了一个 Sha256 证书,如果我们没有找到这个解决方法,唯一的选择就是为这个错误购买一个新的 Sha1 证书。这就是为什么我决定分享它:)
  • 所以该脚本允许您在使用 .Net 4.0 的机器上使用 Sha-256 对程序集进行签名?
  • 你好@sasfrog。在使用 mage.exe 编辑清单文件后,我使用共享的代码对清单文件进行签名,因为使用 mage.exe 签名将使用 SHA256 散列算法对其进行签名。我实际使用的是这个命令 - gist.github.com/nedyalkov/a563dd4fb04d21cb91dc.
  • 你好@sasfrog。我将此代码用作持续交付过程的一部分,在该过程中,我将 ClickOnce 安装程序从一个环境移动到另一个环境,并且我需要更新配置文件和部署清单(.application 文件)。在此更改之后,我需要更新应用程序清单的校验和,对其进行签名并更新部署清单的校验和并对其进行签名。您可以参考以下文章来了解如何更新清单文件 - bit.ly/1vart0Z 和 bit.ly/1prU2Bk。我在更新清单文件后使用 cmdlet 对清单文件进行签名。
【解决方案3】:

我们在以下场景中也遇到了类似的问题。

我们只是从 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") 解决了我们的问题。

【讨论】:

    猜你喜欢
    • 2021-01-14
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多