Créer un certificat auto-signé pour vos packages Windows / UWP de longue durée

Un package Windows est signé avec un certificat de signature de code. Un certificat délivré par Microsoft est utilisé lors du déploiement sur le Store mais pendant vos développements vous utilisez un certificat auto-signé par Visual Studio. Celui a une durée d’un an par défaut ce qui peut être relativement court, de plus, vous préférez peut-être maîtriser ce processus. Dans cet article nous verrons comment générer un certificat de signature de code à la main et lui assigner une durée de vie relativement longue.

 

Les contraintes à respecter

Il n'est pas possible d'utiliser n'importe quel type de certificat car Visual Studio valide certaines propriétés de ce fichier au format PFX:

  • Le certificat doit être considéré comme final : on ne pourra pas créer de certificats à partir de celui-ci.
  • Le certificat doit être de type "signature de code".
  • Le sujet du certificat doit correspondre à l'identité de votre package. Celle-ci se trouve dans le nœud "Identity" de votre appxmanifest ouvert au format XML.

L'import d'un certificat se passe dans l'onglet "Packaging" de l'éditeur du manifest. Cliquez sur Choose Certificate, sélectionnez le fichier PFX, renseignez le mot de passe et voilà. Si une des contraintes du dessus n'est pas respectée, un beau message d'erreur très peu informatif dans lequel on ne peut pas copier-coller le lien qui apparait... 

packageError.PNG

 

Il est possible de dire à Visual Studio de ne pas faire ces vérifications pendant le packaging (ce ne sont pas les certificats que tu recherches... :)) en mettant la propriété MsBuild "EnableSigningChecks" à false.

 

Créer un certificat avec PowerShell

Microsoft met à disposition une documentation détaillée mais indiquée comme périmée sur MSDN. La version à jour permet de générer des certificats considérés comme invalides par Visual Studio (en tout cas pour une application Wndows Store 8.1).


 

Il faut donc glaner des informations à droite et à gauche pour finalement trouver le bon processus mais heureusement cet article existe maintenant !

On utilisera dans PowerShell le processus suivant :

  1. Se placer au niveau des certificats machines personnels,
  2. Utiliser la commande "New-SelfSignedCertificate" pour créer un certificat auto-signé expirant dans X mois,
  3. Exporter ce certificat au format PFX.

 

Il faudra faire attention à bien placer les contraintes de base (end entity et de type "signature de code") sur le certificat en ajoutant le paramètre suivant à la commande "New-SelfSignedCertificate". Si cela est incompréhensible pour vous, c'est normal mais rassurez-vous, la documentation explique un peu ce paramètre. Il s'agit du paramètre manquant dans l'article MSDN "à jour" :

-TextExtension ('2.5.29.37={text}1.3.6.1.5.5.7.3.3','2.5.29.19={text}Subject Type:End Entity')

 

Pour indiquer une date d'expiration loin dans le futur, on rajoutera ce paramètre facilement personnalisable

-NotAfter (Get-Date).AddYears(42)

 

 Le script final 

Je vous propose ici un script personnalisable qui :

  • Demande le mot de passe du certificat à l'utilisateur,
  • Demande la durée d'expiration en année à l'utilisateur,
  • Demande le sujet de certificat à utiliser,
  • Supprime un éventuel certificat existant pour le même sujet de certificat.

 

$pass = Read-Host 'Mot de passe à utiliser?' -AsSecureString
$duree = Read-Host 'Durée en année?'
$subject="Read-Host 'sujet du certificat?'

# Où se trouve t'on ?
$invocation = (Get-Variable MyInvocation).Value
$directorypath = Split-Path $invocation.MyCommand.Path

# on se place au niveau machine
Set-Location Cert:\LocalMachine\My
 
#un certificat du même sujet existe ?
$thumbprint =Get-ChildItem | Where-Object {$_.subject -match $subject}  | Select-Object -first 1 | select -ExpandProperty Thumbprint
if($thumbprint -ne $null)
{
    Write-Host "deleting old one "$thumbprint;
    Remove-Item -Path $thumbprint;
}

# création d'un nouveau certificat
New-SelfSignedCertificate 
    -NotAfter (Get-Date).AddYears(42) 
     -TextExtension ('2.5.29.37={text}1.3.6.1.5.5.7.3.3','2.5.29.19={text}Subject Type:End Entity') 
     -Type Custom -Subject $subject 
     -KeyUsage DigitalSignature 
     -FriendlyName "Certificat de signature de code" 
     -CertStoreLocation "Cert:\LocalMachine\My"

# récupération du thumbprint du certifcat créé
$thumbprint = Get-ChildItem | Where-Object {$_.subject -match $subject} | Select-Object -first 1 | select -ExpandProperty Thumbprint;

#Export du PFX
Export-PfxCertificate -cert $thumbprint -Password $pass -FilePath $directorypath\MON_CERTIFICAT.pfx 

 

Happy coding :)

Photo de profil

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus