2013-05-15 14 views
24

Bei der Arbeit uns eine Clickonce-Anwendung hatten, die, wenn der Client zu installieren versuchen würde, wirft die Ausnahme:„Manifest XML-Signatur ist ungültig“ auf Client-Rechner funktioniert, aber fein auf Entwickler Computer

  • Ausnahmemessungsmanifest aus Datei:/FILEPATH: Das Manifest ist möglicherweise nicht gültig oder die Datei konnte nicht geöffnet werden.

    Die Manifest-XML-Signatur ist nicht gültig.

    SignatureDescription konnte nicht für den bereitgestellten Signaturalgorithmus erstellt werden.

Um dies zu lösen, landeten wir mit einer anderen Zertifikatsdatei, und es hat gut funktioniert (resigniert das Manifest).

Aber wir können nicht verstehen, warum es funktioniert, um die Anwendung in den Maschinen der Entwickler zu installieren (auch Entwickler, die nicht mit der Anwendung arbeiteten), aber es würde nicht für die Maschinen der Klienten funktionieren?

Wir haben nicht viele Informationen darüber, wie die Zertifikate erstellt wurden oder das ClickOnce-Paket, weil die Person, die es getan hat, weg ist und keine Dokumentation darüber hinterlassen hat.

Das Zertifikat, das verwendet wurde, hatte kein Kennwort und normale Benutzer haben keine Administratorrechte.

Von Stack-Überlauf Frage Manifest XML signature is not valid, ich, dass das Problem vielleicht war erraten konnte, dass sie das Projekt und das Zertifikat mit .NET Rahmen erstellt 4.5 und dann, wenn sie die Anwendung festgelegt mit .NET Framework 4.0 ausführen können, haben sie nicht Ändern Sie den Signaturalgorithmus. Aber dann würde ich sagen, es sollte auch nicht für die Entwickler funktionieren.

Jeder Einblick, den Sie mir geben könnten, würde sehr geschätzt werden.

+0

Dumme Frage, aber kann die Maschine, die die Probleme hat, die Datei mit dem gleichen Pfad wie in der Fehlermeldung angegeben öffnen? – Josh

+1

Ja, alles war zugänglich. Außerdem habe ich das Paket bearbeitet und ein anderes Zertifikat verwendet, also war alles an der gleichen Stelle wie zuvor, aber mit einem anderen Zertifikat. Und es funktionierte in dem Computer, der Probleme hatte. – Dzyann

Antwort

26

Update: Dies ist ab Visual Studio 2013 Update 3 behoben. Versuchen Sie, Ihre App von dieser Version von VS oder höher zu veröffentlichen.

Zurück Antwort:

Es ist, weil Ihr Entwickler Maschine .NET 4.5 installiert hatte, während der Client-Rechner nur .NET 4.0 installiert hatte. Die .NET 4.0-Clientcomputer können das Manifest nicht lesen, da sie SHA-1 erwarten, während die .NET 4.5-Entwicklermaschinen dies können.

Weitere Informationen finden Sie unter this blog post.

Diese Änderung auf die Tatsache zurückzuführen ist, dass wir Legacy-Zertifikate als Standard verwenden gestoppt (SHA-1) in NetFX4.5 Manifest zu unterzeichnen und stattdessen verwenden neuere Version (SHA-256), die von nicht erkannt NetFx4.0 Laufzeit. Beim Analysieren des Manifests beschwert sich daher die 4.0-Laufzeitumgebung über ein ungültiges Manifest. Wenn wir bei älteren Frameworks versuchen, eine ClickOnce-App auf einer Box auszuführen, die keine ausgerichtete Laufzeit hat, zeigt ClickOnce dem Benutzer eine Meldung an, in der es heißt: "Sie benötigen xxxx.xx Laufzeit, um diese App auszuführen". Aber wenn .NET 4.5 gestartet wird und eine 4.5 ClickOnce App auf der Box ausgeführt wird, auf der nur .NET 4.0 installiert ist, beschwert sich die Nachricht über ein ungültiges Manifest. Um das Problem zu beheben, müssen Sie .Net Framework 4.5 auf dem Zielsystem installieren.

Versuchen Sie, Ihr Manifest mit einem SHA-1-Zertifikat anstelle eines SHA-2-Zertifikats zu signieren.

+7

+1 aber verdammt MS, was, wenn Sie 4.5 nicht installieren können, weil es ein 2k3 Server ist? Was ist der Punkt, wenn Sie frühere Versionen der Runtime als Ziel verwenden können, wenn Sie sie dann nicht installieren können? –

+0

Ja, mir scheint es auch seltsam.Aus meiner Sicht müssen Sie nur ein SHA-1-Zertifikat verwenden. – MatthewKing

+4

Falls Sie Ihrer Antwort Anweisungen hinzufügen möchten, besteht die Lösung darin, Ihr Projekt in VS2010 zu öffnen, zu den Projekteigenschaften zu gehen und die Signierung auszuwählen und dann "Testzertifikat erstellen". Dies wird eins mit SHA1 erzeugen und scheint nichts anderes im Projekt zu ändern. –

12

Wir hatten ähnliches Problem - wir haben eine .NET 4.0-Anwendung, die auf Rechnern mit .NET 4.0 oder höher arbeiten soll. Als unser Codesignaturzertifikat abgelaufen ist, haben wir einen neuen gekauft und da Sha1 entzogen wird, haben wir einen Sha256 erhalten. Ich sollte sagen, dass unsere Build-Maschine .NET 4.5 installiert hat, so dass die Framework-Assemblys alle auf dieser Maschine aktualisiert werden.

Wir haben festgestellt, dass die folgenden Fehler auf nur .NET 4.0 Maschinen erscheinen begannen, sobald wir auf das neue Zertifikat migriert:

* 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. 

Nach einem wenig Recherche fe dieses Thema fanden heraus, und einige andere, was darauf hindeutet, ein Upgrade auf .NET 4.5, aber das funktioniert nicht für uns - wir wollen unsere Kunden nicht zwingen, .NET Framework zu aktualisieren (~ 20% verwenden immer noch .NET 4.0). Hier sind die Lösungen, die wir kamen bis zu:

  • Zeichen die Manifeste auf einer Maschine, die nur .NET 4.0 installiert
  • Zeichen mit dem folgenden Powershell-Skript anstelle von mage.exe hat:
 
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(); 
    } 
} 

EDIT: ich eigentlich diesen Befehl lassen verwenden, um die Manifest-Dateien zu unterschreiben: https://gist.github.com/nedyalkov/a563dd4fb04d21cb91dc

Ich hoffe, diese Information wird Zeit und Mühe für jemanden sparen!

+0

Die akzeptierte Antwort schlägt nicht vor, auf 4,5 zu aktualisieren, das ist nur das Zitat. Die Lösung war, mit SHA-1 zu signieren. – Dzyann

+0

Ja, Sie haben Recht. Ich mischte das Zitat und die Antwort. Wie auch immer, die Unterzeichnung mit Sha1 ist nicht immer eine Option, da es in diesem Jahr veraltet sein soll. Dies war auch unser Fall - wir hatten bereits ein Sha256-Zertifikat erworben und wenn wir diese Arbeit nicht gefunden hatten, war die einzige Option, ein neues Sha1-Zertifikat nur für diesen Fehler zu kaufen. Deshalb habe ich beschlossen, es zu teilen :) –

+0

So ermöglicht das Skript, dass Sie die Baugruppen mit Sha-256 in einer Maschine mit .Net 4.0 signieren? – Dzyann

0

Wir haben auch im folgenden Szenario ähnliches Problem konfrontiert.

Wir haben einfach von VS2008 vs2013-Update migriert 5.

Unsere Clickonce-Anwendung auf .net 3.5 ist.

Danach, unsere clickonce App Build mit Nant-Skript auf der Eingabeaufforderung gab den gleichen Fehler "Manifest XML-Signatur ist nicht gültig" auf einer Maschine, die .NET Framework-Version älter als 4.5 hat.

Wie wir vs2013-Update 5, es war offensichtlich nicht im Zusammenhang getan fix in vs2013-Update 3.

Nachdem ich Versuch und Irrtum auf einer Beispielanwendung verwendet hat, sortierten wir heraus, dass Mage.exe die Wir verwenden das Manifest nach der Aktualisierung des Manifests. Wenn wir Setup mit der Entwicklerbefehlseingabe von VS2013 erstellen, wird mage.exe verwendet, das mit VS2013 installiert wird und nicht über den gleichen Fix verfügt wie in VS2013 Update 3. Verwendung von alter mage.exe, installiert mit vs2008 (normalerweise bei " C: \ Programme (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin ") löste unser Problem.