2 votes

Signature d'une application ClickOnce avec une cible AfterCompile

J'ai essayé de me faire à l'idée que Certificats Authenticode depuis une semaine maintenant. J'ai acheté un CSC chez Comodo et j'ai une application ClickOnce que j'aimerais signer pour que les avertissements du filtre SmartScreen disparaissent.

L'assemblage de mon application porte un nom fort et j'ai coché la case "Signer l'assemblage" dans les propriétés de mon projet. J'ai également coché la case " Signer le manifeste ClickOnce " dans les mêmes propriétés du projet. Enfin, j'ai configuré les exécutions suivantes comme cibles AfterCompile dans mon fichier de projet, afin de signer l'exécutable à la fois avec SHA1 et SHA256 :

<Target Name="AfterCompile">
  <Exec Command="&quot;C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe&quot; sign /f &quot;$(ProjectDir)certificate.pfx&quot; /p mypassword /t http://timestamp.comodoca.com /v &quot;$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)&quot;" />
  <Exec Command="&quot;C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe&quot; sign /f &quot;$(ProjectDir)certificate.pfx&quot; /p mypassword /fd sha256 /tr http://timestamp.comodoca.com/?td=sha256 /td sha256 /as /v &quot;$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)&quot;" />
</Target>

Ensuite, je lance la commande suivante pour publier le projet :

" C:\Program Fichiers (x86) \MSBuild\14.0\Bin\MSBuild.exe " /target:Publish /p:Configuration=Release /p:Platform=AnyCPU MyCoolApplication.csproj

Ce que j'ai remarqué, c'est que cette commande crée finalement trois versions distinctes de MyCoolApplication.exe :

  • Il construit une copie dans le bac \Release qui est non signée
  • Il construit une autre copie dans obj \Release qui est doublement signé
  • Il construit une copie finale dans le bac \Release\app.publish qui n'est signée qu'une seule fois et à laquelle il manque un horodatage.

Malheureusement, c'est la copie dans la poubelle \Release\app.publish qui doit fonctionner, mais pour une raison quelconque, cette version supprime la double signature. D'après ce que j'ai compris - qui peut être erroné -, les choses étaient construites dans obj. \Release et les a copiés dans la poubelle \Release\app.publish et a ensuite signé le manifeste. Cependant, il est clair que quelque chose d'autre se passe, car la signature numérique sur l'exécutable final est clairement modifiée. Voici les propriétés de ces deux fichiers côte à côte :

dual-signed single-signed, no timestamp

Le problème avec la version finale à signature unique et horodatage manquant est que l'application est toujours signalée par le filtre SmartScreen, ce qui rend l'ensemble du processus inutile. Comment puis-je résoudre ce problème ?

UPDATE : Après avoir lu ce guide Si j'ai signé correctement, il semble que même si je signe les documents, je risque de me heurter au filtre SmartScreen parce que ma "réputation" n'est pas suffisante pour mon application. Cependant, j'aimerais confirmer que j'ai bien signé les choses et que je ne suis pas en train de m'enfuir. (Ou si c'est le signe d'une défaillance dans le processus de construction, je veux y remédier).

EDITAR: Voici la fin de la sortie de MSBuild.exe, que @CodeFuller a demandé :

Après la compilation :

"signtool.exe" sign /f "certificate.pfx" /p mypassword /t http://timestamp.comodoca.com /v "MyCoolApplication \obj\Release\MyCoolApplication.exe "

Le certificat suivant a été sélectionné :

...

Terminé Ajout d'un magasin supplémentaire

Signé avec succès : MyCoolApplication \obj\Release\MyCoolApplication.exe

Nombre de fichiers signés avec succès : 1

Nombre d'avertissements : 0

Nombre d'erreurs : 0

"signtool.exe" sign /f "MyCoolApp lication \certificate.pfx " /p monmotdepasse /fd sha256 /tr http://timestamp.comodoca.com/?td=sha256 /td sha256 /as /v "MyCoolApplication \obj\Release\MyCoolApplication.exe "

Le certificat suivant a été sélectionné :

...

Terminé Ajout d'un magasin supplémentaire

Signé avec succès : MyCoolApplication \obj\Release\MyCoolApplication.exe

Nombre de fichiers signés avec succès : 1

Nombre d'avertissements : 0

Nombre d'erreurs : 0

_DeploymentComputeClickOnceManifestInfo :

Création du répertoire "bin \Release\app.publish ".

Copie du fichier de "obj \Release\MyCoolApplication.exe "à "bin \Release\app.publish\MyCoolApplication.exe ".

_CopyAppConfigFile :

Copie du fichier de "App.config" à "bin". \Release\MyCoolApplication.exe.config ".

_CopyManifestFiles :

Copie du fichier de "obj \Release\MyCoolApplication.exe.manifest "à "bin \Release\MyCoolApplication.exe.manifest ".

MonApplicationCool -> C:\Users\Gordon\Documents\Visual Studio 2015 \Projects\MyCoolApplication\MyCoolApplication\bin\Release\MyCoolApplication.exe.manifest

Copie du fichier de "obj \Release\MyCoolApplication.application "à "bin \Release\MyCoolApplication.application ".

MonApplicationCool -> C:\Users\Gordon\Documents\Visual Studio 2015 \Projects\MyCoolApplication\MyCoolApplication\bin\Release\MyCoolApplication.application

Copier les fichiers dans le répertoire de sortie :

Copie du fichier de "obj \Release\MyCoolApplication.exe "à "bin \Release\MyCoolApplication.exe ".

MonApplicationCool -> C:\Users\Gordon\Documents\Visual Studio 2015 \Projects\MyCoolApplication\MyCoolApplication\bin\Release\MyCoolApplication.exe

Copie du fichier de "obj \Release\MyCoolApplication.pdb "à "bin \Release\MyCoolApplication.pdb ".

_CopyFilesToPublishFolder :

Création du répertoire "bin \Release\app.publish\Application Fichiers \MyCoolApplication_1_0_0_0 ".

Copie du fichier de "bin \Release\MyCoolApplication.exe.manifest "à "bin \Release\app.publish\Application Fichiers \MyCoolApplication_1_0_0_0\MyCoolApplication.exe.manifest ". Copie du fichier de "bin \Release\app.publish\MyCoolApplication.exe "à "bin \Release\app.publish\Application Fichiers \MyCoolApplication_1_0_0_0\MyCoolApplication.exe.deploy ". Copie du fichier de "App.config" vers "bin \Release\app.publish\Application Fichiers \MyCoolApplication_1_0_0_0\MyCoolApplication.exe.config.deploy ". Copie du fichier "triforce.ico" vers "bin". \Release\app.publish\Application Fichiers \MyCoolApplication_1_0_0_0\triforce.ico.deploy ". Projet de construction terminé " C:\Users\Gordon\Documents\Visual Studio 2015 \Projects\MyCoolApplication\MyCoolApplication\MyCoolApplication.csproj " (Publier la ou les cibles).

Construction réussie. 0 Avertissement(s) 0 erreur(s)

Temps écoulé 00:00:06.53

2voto

CodeFuller Points 20614

Vous avez raison de vous attendre à ce que les binaires soient construites en obj\Release et ensuite copié dans bin\Release\app.publish . Et pour mon projet de test avec les mêmes étapes personnalisées de AfterCompile cible tout fonctionne comme prévu. Il est donc probable que quelque chose ne va pas pendant la construction. Pour une enquête plus approfondie, veuillez mettre à jour votre question avec la sortie de MSBuild.exe .

Voici ma séquence de construction :

Après la compilation :
"signtool.exe" sign /f "MyKey.pfx" /p mypassword /t http://timestamp.comodoca.com /v "MonApplicationCool \obj\Release\MyCoolApplication.exe "
...

Signé avec succès : MyCoolApplication \obj\Release\MyCoolApplication.exe

Nombre de fichiers signés avec succès : 1

Nombre d'avertissements avertissements : 0

Nombre d'erreurs : 0

"signtool.exe" sign /f "MyKey.pfx" /p mypassword /fd sha256 /tr http://timestamp.comodoca.com/?td=sha256 /td sha256 /as /v "MyCoolApplication \obj\Release\MyCoolApplication.exe "
...

Signé avec succès : MyCoolApplication \obj\Release\MyCoolApplication.exe

Nombre de fichiers signés avec succès : 1

Nombre de avertissements : 0

Nombre d'erreurs : 0

CleanPublishFolder :
Suppression du répertoire "bin \Release\app.publish\ ".
_DeploymentComputeClickOnceManifestInfo :
Création du répertoire "bin \Release\app.publish ".
Copie d'un fichier à partir de "obj \Release\MyCoolApplication.exe " vers " bin \Release\app.publish\MyCoolApplication.exe ".
...
La construction a réussi.
0 Avertissement(s)
0 erreur(s)

enter image description here

Je continuerais donc avec les questions suivantes :

  • Votre sortie MSBuild contient-elle la même séquence ou est-elle différente ?
  • La sortie contient-elle des erreurs ?
  • Après la construction, est-ce que les timestamps de obj\Release\MyCoolApplication.exe y Release\app.publish\MyCoolApplication.exe fichiers égaux ?
  • Le contenu de ces fichiers est-il identique ou différent ?

UPDATE :

Après avoir activé la verbosité du diagnostic dans la sortie de la compilation, tout s'est un peu éclairci.

L'activation de l'option "Signer les manifestes ClickOnce" dans l'onglet "Signer" des paramètres du projet entraîne les conséquences suivantes SignTool.exe Appel à bin\Release\app.publish\MyCoolApplication.exe . Par défaut, SignTool va écraser la signature existante. C'est pourquoi le deuxième appel de SignTool dans votre cible AfterCompile est effectué avec l'option /as key - l'option pour ajouter la signature.

Donc, si vous voulez conserver vos commandes de signature personnalisées, vous devez désactiver l'option " Signer les manifestes ClickOnce " et ajouter des commandes personnalisées pour signer le manifeste. Pour ce faire, les fichiers suivants doivent être signés lors des étapes de construction suivantes :

Après _DeploymentComputeClickOnceManifestInfo cible : bin\Release\app.publish\MyCoolApplication.exe . La macro pour le nom de fichier est "$(PublishDir)$(TargetFileName)"

Après _DeploymentSignClickOnceDeployment cible : bin\Release\app.publish\Application Files\MyCoolApplication_1_0_0_3\MyCoolApplication.exe.manifest - "$(_DeploymentApplicationDir)$(_DeploymentTargetApplicationManifestFileName)" bin\Release\app.publish\MyCoolApplication.application - "$(PublishDir)$(TargetDeployManifestFileName)" bin\Release\app.publish\setup.exe - $(PublishDir)\setup.exe

Le manifeste doit être signé avec mage.exe outil.

Voici un fichier de projet mis à jour qui permet d'obtenir ce dont vous avez besoin :

<Target Name="AfterCompile">
<Exec Command="&quot;C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe&quot; sign /f &quot;$(ProjectDir)certificate.pfx&quot; /p mypassword /t http://timestamp.comodoca.com /v &quot;$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)&quot;" />
<Exec Command="&quot;C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe&quot; sign /f &quot;$(ProjectDir)certificate.pfx&quot; /p mypassword /fd sha256 /tr http://timestamp.comodoca.com/?td=sha256 /td sha256 /as /v &quot;$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)&quot;" />
</Target>

<Target Name="SignAssembly" AfterTargets="_DeploymentComputeClickOnceManifestInfo">
<Exec Command="&quot;C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe&quot; sign /f &quot;$(ProjectDir)certificate.pfx&quot; /p mypassword /t http://timestamp.comodoca.com /v &quot;$(PublishDir)$(TargetFileName)&quot;" />
<Exec Command="&quot;C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe&quot; sign /f &quot;$(ProjectDir)certificate.pfx&quot; /p mypassword /fd sha256 /tr http://timestamp.comodoca.com/?td=sha256 /td sha256 /as /v &quot;$(PublishDir)$(TargetFileName)&quot;" />
</Target>

<Target Name="SignManifest" AfterTargets="_DeploymentSignClickOnceDeployment">
<Exec Command="&quot;c:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\mage.exe&quot; -Sign &quot;$(_DeploymentApplicationDir)$(_DeploymentTargetApplicationManifestFileName)&quot; -CertFile &quot;$(ProjectDir)certificate.pfx&quot; -Password mypassword -TimeStampUri http://timestamp.comodoca.com" />
<Exec Command="&quot;c:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\mage.exe&quot; -Sign &quot;$(PublishDir)$(TargetDeployManifestFileName)&quot; -CertFile &quot;$(ProjectDir)certificate.pfx&quot; -Password mypassword -TimeStampUri http://timestamp.comodoca.com" />
<Exec Command="&quot;C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe&quot; sign /f &quot;$(ProjectDir)certificate.pfx&quot; /p mypassword /t http://timestamp.comodoca.com /v &quot;$(PublishDir)\setup.exe&quot;" />
<Exec Command="&quot;C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe&quot; sign /f &quot;$(ProjectDir)certificate.pfx&quot; /p mypassword /fd sha256 /tr http://timestamp.comodoca.com/?td=sha256 /td sha256 /as /v &quot;$(PublishDir)\setup.exe&quot;" />
</Target>

1voto

user704808 Points 656

Le fait de cocher "Signer l'assemblage" et "Signer le manifeste ClickOnce" dans les Propriétés du projet entraîne finalement l'exécution de signtool.exe (via le SignFile tâche MSBuild), ce qui me semble susceptible d'entrer en conflit avec votre Exec tâches, en raison de la redondance et/ou de différences dans la version de signtool.exe les deux voies s'exécutent. Essayez les modifications suivantes, une par une (en sautant évidemment celles que vous avez déjà essayées).

  • Décochez les cases "Signer l'assemblage" et "Signer le manifeste ClickOnce" dans les propriétés du projet.
  • Cochez simplement "Signer le manifeste ClickOnce".
  • Vérifiez simplement "Signer l'assemblée".
  • Commentez votre AfterCompile et cochez juste "Signer le manifeste ClickOnce".
  • Commentez votre AfterCompile cible et vérifier simplement "Signer l'assemblage".
  • Commentez votre AfterCompile et cochez à la fois "Signer l'assemblage" et "Signer le manifeste ClickOnce".
  • Changez votre commande en la suivante et essayez-la avec les permutations ci-dessus : "C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" /target:Publish /p:Configuration=Release /p:Platform=AnyCPU /p:TargetFrameworkSDKToolsDirectory="C:\Program Files (x86)\Windows Kits\8.1\bin\x64\" MyCoolApplication.csproj

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X