web-dev-qa-db-fra.com

"La signature XML du manifeste n'est pas valide" sur l'ordinateur client mais fonctionne correctement sur l'ordinateur du développeur

Au travail, nous avions une application ClickOnce qui, lorsque le client essayait de s’installer, lançait l’exception:

  • Exception lors de la lecture du manifeste du fichier:/FILEPATH: le manifeste peut ne pas être valide ou le fichier ne peut pas être ouvert.

    La signature XML du manifeste n'est pas valide.

    SignatureDescription n'a pas pu être créé pour l'algorithme de signature fourni.

Pour résoudre ce problème, nous avons fini par utiliser un autre fichier de certificat, qui a bien fonctionné (a démissionné du manifeste).

Mais nous ne pouvons pas comprendre pourquoi l’application fonctionnerait sur les machines des développeurs (même les développeurs qui ne travaillaient pas avec l’application), mais cela ne fonctionnerait pas pour les machines des clients?

Nous n'avons pas beaucoup d'informations sur la façon dont les certificats ont été créés ou sur le package ClickOnce, car la personne qui l'a fait est partie et n'a pas laissé de documentation à ce sujet.

Le certificat utilisé n'avait pas de mot de passe et les utilisateurs normaux ne disposent pas de droits d'administrateur.

De la question de débordement de pile La signature XML du manifeste n'est pas valide, je suppose que le problème est peut-être qu'ils ont créé le projet et le certificat avec .NET Framework 4.5, puis lorsqu'ils ont défini l'application pour fonctionner avec .NET Framework 4.0, ils n’ont pas changé l’algorithme de signature. Mais ensuite, je suppose que cela ne devrait pas fonctionner pour les développeurs non plus.

Toute idée que vous pourriez me donner serait grandement appréciée.

24
Dzyann

Update: ce problème a été résolu à partir de Visual Studio 2013 Update 3. Essayez de publier votre application à partir de cette version de VS ou ultérieure.

Réponse précédente:

C'est parce que .NET 4.5 était installé sur votre machine de développement, alors que .NET 4.0 était installé sur vos machines clientes. Les machines clientes .NET 4.0 ne peuvent pas lire le manifeste, car elles s’attendent à SHA-1, contrairement aux machines pour développeurs .NET 4.5.

Voir cet article de blog pour un contexte supplémentaire.

Cette modification est due au fait que nous avons cessé d'utiliser les certificats hérités par défaut (SHA-1) dans NetFX4.5 pour signer le manifeste. Nous utilisons plutôt une version plus récente (SHA-256), qui n'est pas reconnue par le runtime de NetFx4.0. Par conséquent, lors de l'analyse du manifeste, le moteur d'exécution 4.0 se plaint d'un manifeste non valide. Pour les frameworks existants, lorsque nous essayons d'exécuter une application ClickOnce sur une boîte sans runtime ciblé, ClickOnce affiche un message indiquant à l'utilisateur que "vous avez besoin du runtime xxxx.xx pour exécuter cette application". Mais à partir de .NET 4.5, si une application 4.5 ClickOnce est exécutée sur la boîte avec uniquement .NET 4.0 installée, le message se plaint d’un manifeste non valide. Afin de résoudre le problème, vous devez installer .Net Framework 4.5 sur le système cible.

Essayez de signer votre manifeste avec un certificat SHA-1 au lieu d'un certificat SHA-2.

25
MatthewKing

Nous avons eu un problème similaire - nous avons une application .NET 4.0, destinée à fonctionner sur des machines avec .NET 4.0 ou supérieur. Comme notre certificat de signature de code a expiré, nous en avons acheté un nouveau et, comme Sha1 va être supprimé, nous en avons reçu un. Je devrais dire que .NET 4.5 est installé sur notre machine de compilation, de sorte que les assemblys d'infrastructure sont tous mis à jour sur cette machine.

Nous avons constaté que l'erreur suivante commençait à n'apparaître que sur les ordinateurs .NET 4.0 une fois la migration effectuée vers le nouveau certificat:

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

Après quelques recherches, j'ai découvert ce fil et un autre, suggérant de passer à .NET 4.5, mais cette solution ne fonctionne pas pour nous - nous ne voulons pas forcer nos clients à mettre à jour le framework .NET (environ 20% utilisent encore .NET 4.0). Voici les solutions que nous avons trouvées:

  • Signer les manifestes sur une machine sur laquelle seul .NET 4.0 est installé
  • Signer avec le script PowerShell suivant au lieu d'utiliser 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) 
 essayer
 {
 $ 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] 

 # Ceci forcera l’utilisation de SHA1 au lieu de SHA256 
 $ cert.SignatureAlgorithm.FriendlyName = "" 

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

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

EDIT: J'utilise cette commande pour signer les fichiers de manifeste:https://Gist.github.com/nedyalkov/a563dd4fb04d21cb91dc

J'espère que cette information permettra à quelqu'un d'économiser du temps et des efforts!

13
Miroslav Nedyalkov

Nous avons également rencontré le même problème dans le scénario suivant.

Nous avons simplement migré de vs2008 vers vs2013-update 5.

Notre application clickonce est sur .net 3.5.

Après cela, notre application clickonce utilisant le script nant sur l'invite de commande donnait la même erreur "La signature XML manifeste n'est pas valide" sur une machine disposant de la version du framework .net antérieure à la version 4.5.

Comme nous utilisions vs2013-update 5, il n’était évidemment pas lié au correctif effectué dans vs2013-update 3.

Après des essais et des erreurs sur un exemple d'application, nous avons trié le fichier mage.exe que nous utilisons pour renoncer au manifeste après la mise à jour du manifeste. Lorsque nous créons une installation à l’aide de la commande de développeur VS2013, Prompt, il utilise mage.exe, qui est installé avec VS2013 et n’a pas le même correctif que celui utilisé dans la mise à jour 3 de VS2013. C:\Program Files (x86)\Microsoft SDK\Windows\v7.0A\Bin ") ont résolu notre problème.

0
rikencpatel