Signer un XPI

Cette page vient d'être traduite, mais elle a besoin d'un relecteur différent du traducteur. Pensez également à toujours vérifier le contenu avec sa toute dernière version en anglais.

Cet article est un miroir de l'original (Wayback Machine Archive), avec une petite mise à jour. L'original est fréquemment non disponible.

Cet article décrit comment signer vos propres extensions Firefox avec un certificat signant le code sur une plateforme Windows. Il a été développé à partir de l'article linux So you want to sign your XPI package? par Pete Collins du groupe MozDev.

1. Téléchargez le dernier paquetage Network Security Services (NSS) depuis le site FTP de Mozilla ftp://ftp.mozilla.org/pub/mozilla.or.../nss/releases/. Pour Windows, vous aurez besoin du paquet nss-3.9.zip dans le répertoire NSS_3_9_RTM/WINNT5.0_OPT.OBJ/.

2. Extrayez le contenu de l'archive dans un répertoire local. Dans notre cas, il s'agit de C:\Apps\nss-3.9\.

3. Téléchargez la version récente de Netscape Portable Runtime sur le site FTP de Mozilla : http://ftp.mozilla.org/pub/mozilla.org/nspr/releases/. Pour Windows, aurez besoin du paquet nspr-4.6.zip dans le répertoire v4.6/WINNT5.0_OPT.OBJ/.

4. Extrayez le contenu de l'archive dans un répertoire local. Dans notre cas, il s'agit de C:\Apps\nspr-4.6\.

5. Ajoutez les répertoires bin/ et lib/ des outils NSS, et lib/ de NSPR aux chemins du système. Vous pouvez soit les définir de manière permanente via le Panneau de configuration->Propriétés système->Avancé->Variables d'environnement->Variables système ou le faire à chaque fois que vous lancez les outils en ligne de commande (de préférence avec un fichier batch). Windows contient sa propre version de certains de ces fichiers (par ex. certutil.exe) dans le répertoire système (\Windows\system32\), donc assurez vous que les nouveaux chemins soient déclarés en premier dans la liste de recherche du PATH.

C:\> set PATH=<b>C:\Apps\nss-3.9\bin\;C:\Apps\nss-3.9\lib\;C:\Apps\nspr-4.6\lib\;</b>%PATH%

6. Relisez la documentation des outils NSS.

7. Initialisez la base de données des certificats. Décidez quel sera le répertoire à créer pour contenir la base de données des certificats. Utilisez cette commande pour le créer (Notez le point final).

C:\Projects\CodeSigning\> certutil -N -d .

Le point sert à créer la base de données dans le répertoire courant.

Il vous sera demandé un mot de passe pour la base de données NSS - ne n'oubliez pas !.

C:\Projects\CodeSigning\> certutil -N -d .
Enter a password which will be used to encrypt your keys.
The password should be at least 8 characters long,
and should contain at least one non-alphabetic character.

Enter new password:
Re-enter password:

8. Créez un certificat de test en utilisant l'option -p pour définir un mot de passe pour le nouveau certificat.

C:\Projects\CodeSigning\> signtool -G myTestCert -d . -p"password"
using certificate directory: .

WARNING: Performing this operation while the browser is running could cause
corruption of your security databases. If the browser is currently running,
you should exit the browser before continuing this operation. Enter
"y" to continue, or anything else to abort: y


Enter certificate information.  All fields are optional. Acceptable
characters are numbers, letters, spaces, and apostrophes.
certificate common name: XPI Test
organization: TJworld
organization unit: Software
state or province: Nottingham
country (must be exactly 2 characters): GB
username: tj
email address: certificates@lan.tjworld.net
generated public/private key pair
certificate request generated
certificate has been signed
certificate "myTestCert" added to database
Exported certificate to x509.raw and x509.cacert.

x509.cacert servira à signer votre paquetage XPI. Vérifiez qu'il existe sur votre système de fichier et dans votre base de données de certificats :

C:\Projects\CodeSigning\> dir x509*

14/12/2005  15:13             1,031 x509.cacert
14/12/2005  15:13               798 x509.raw

C:\Projects\CodeSigning\> certutil -d . -L
myTestCert                                                   u,u,Cu

8. Préparez votre fichier XPI à signer

Créez un nouveau répertoire simplement pour la signature, copiez-y votre XPI, décompressez-le (unzip*, en conservant les sous-répertoires), effacez le XPI et retournez dans le répertoire de la base de données des certificats.

*Cela suppose que vous disposez d'un utilitaire zip sur votre système d'exploitation. Cet exemple utilise l'outil CygWin bin/zip.exe. Vous pouvez utiliser un outil graphique Zip pourvu qu'il gère correctement la structure interne des sous-répertoires. Le <font color="red">soft 7-Zip ne fonctionne pas</font> lors de la création des archives signées XPI Mozilla car il trie alphabétiquement les entrées de répertoires, et <font color="red">Mozilla exige que la première entrée soit META-INF/zigbert.rsa</font>.

C:\Projects\CodeSigning\> md signed

C:\Projects\CodeSigning\> copy C:\Projects\fsb\fsb.xpi signed
        1 file(s) copied.

C:\Projects\CodeSigning\> cd signed

C:\Projects\CodeSigning\signed> unzip fsb.xpi
Archive:  fsb.xpi
   creating: chrome/
  inflating: chrome.manifest
  inflating: chrome/fsb.jar
  inflating: install.rdf

C:\Projects\CodeSigning\signed> del fsb.xpi

C:\Projects\CodeSigning\signed> cd ..

9. Signez votre XPI

C:\Projects\CodeSigning\> signtool -d . -k myTestCert -p "password" signed/
using certificate directory: .
Generating signed//META-INF/manifest.mf file..
--> chrome/fsb.jar
--> chrome.manifest
--> install.rdf
Generating zigbert.sf file..
tree "signed/" signed successfully

10. Re-paquetagez votre XPI

Placez vous dans le répertoire signed/, créez un nouveau zip avec le fichier META-INF/zigbert.rsa placé en premier, et ensuite ajoutez-y les fichiers restants.

C:\Projects\Certs\> cd signed

C:\Projects\CodeSigning\signed\> zip fsb.xpi META-INF/zigbert.rsa
  adding: META-INF/zigbert.rsa (deflated 35%)

C:\Projects\CodeSigning\signed> zip -r -D fsb.xpi * -x META-INF/zigbert.rsa
  adding: META-INF/manifest.mf (deflated 37%)
  adding: META-INF/zigbert.sf (deflated 40%)
  adding: chrome/fsb.jar (deflated 74%)
  adding: chrome.manifest (deflated 69%)
  adding: install.rdf (deflated 62%)

11. Installez temporairement le certificat de sécurité test dans votre navigateur Mozilla.

Renommez le fichier x509.cacert généré précédemment en x509.<font color="red">cert</font>.

Importez le dans Mozilla Firefox comme une autorité de certification de développement logiciels. <font color="red">* Effacez le certificat de Mozilla Firefox une fois que vous avez fini de tester.</font>

Firefox 2.0 : Depuis le menu Outils, choisissez Options->Avancé->Chiffrement->Afficher les certificats->Autorités

Firefox 1.5 : Depuis le menu Outils, choisissez Options->Avancé->Sécurité->Afficher les certificats->Autorités

Appuyez sur le bouton Importer.

Parcourez le répertoire contenant x509.cert et sélectionnez le.

Dans la boîte de dialogue Téléchargement du certificat, cochez Confirmer cette AC pour identifier les développeurs de logiciels. et appuyez sur le bouton Voir si vous souhaitez examinez plus précisément le certificat.

Appuyez sur le bouton Ok et votre nouveau certificat apparaîtra dans la liste des autorités.

12. Essayez d'installer l'extension signée

Faites soit un glisser-déposer du XPI signé, ou naviguez et téléchargez le. Lorsque la boîte de dialogue Installation d'un logiciel apparaît, le nom de l'organisation du certificat apparaîtra là où Firefox affiche habituellement <font color="red">non signé</font>.

image PAS D'IMAGE

13. Obtenez un certificat valide de signature de code logiciel

Maintenant que vous savez que tout fonctionne, vous devez ajouter un véritable certificat logiciel à la base de données de certificats NSS, et l'utiliser pour signer le XPI. Il existe plusieurs émetteurs de certificats logiciel ayant les trois clés différentielles : disponibilité, cout et vérification d'identité.

La plupart des émetteurs ne fournissent pas de certificat logiciel à des individus (comme cela est ridicule), donc vous devrez chercher pour en trouver un qui le fasse, et qui dispose d'une autorité de certification racine installée dans Mozilla Firefox. Sans ce certificat racine de l'autorité, Mozilla Firefox ne confirmera pas la validité de votre certificat aux utilisateurs voulant installer votre extension. Dans l'idéal, vous souhaiterez un certificat disposant d'une autorité de certification racine installée sur toutes les plateformes (Microsoft Windows, Sun Java, Mozilla/Netscape Firefox/Navigator, Opera) afin de n'avoir qu'un seul certificat signant tous vos logiciels indépendamment de la plateforme pour laquel ils sont prévus.

Le certificat le moins cher universellement supporté (Mozilla, Java, Microsoft) semble être l'offre de Comodo Instant-SSL. Vous pouvez obtenir un free certificate for open-source developers de la part de Unizeto Certum, mais leur certificat racine est seulement présent dans Mozilla Firefox et Opera (pas Java ni Microsoft).

Voici quelques émetteurs courants :

  • Comodo Instant-SSL Code Signing
  • Digi-Sign Digi-Code
  • GeoTrust Code Signing
  • Thawte Code Signing (appartenant à Verisign)
  • Unizeto Certum Code-signing (free certificates for open-source authors) <font color="red">* seulement disponible dans Mozilla Firefox et Opera depuis le 14 déc 2005</font>
  • Verisign Code Signing

Vous aurez besoin de demander un certificat logiciel et remplir les conditions d'éligibilité demandés par l'émetteur du certificat. Un certificat signé vous sera alors attribué. Lorsque vous le recevrez, il devra être importé dans la base de données des certificats.

<font color="red">Votre navigateur va générer une nouvelle clé privée et faire une requête de signature du code (CSR) en arrière plan sans que vous vous en aperceviez. La requête CSR sera transmise à l'émetteur. Plus tard, vous devrez utiliser le même navigateur pour installer le nouveau certificat parce que la clé et le certificat sont indissociables. </font>

Astuce : Lorsque vous demandez un certificat, vérifiez que Organisation (O) contienne votre nom et pas le texte par défaut de l'émetteur, car c'est ce qui sera affiché aux utilisateurs.

Pour ce guide, j'ai demandé un certificat libre depuis Unizeto Certum. Après avoir complété le formulaire application où j'ai saisi mes informations dans l'application en ligne, j'ai reçu un courriel automatique réclamant des preuves de mon identité sous la forme de photos. J'ai scanné en haute résolution mon passeport et mon permis de conduire que j'ai placé sur un serveur temporairement, et j'ai envoyé à Unizeto Certum les informations et l'emplacement des fichiers. Après quelques heures, j'ai reçu un courriel de confirmation d'un humain acceptant les images d'identifications visuelles et me donnant un lien hypertexte pour télécharger le certificat.

<font color="red">Installez le certificat dans Mozilla Firefox (ce qui va avec la clé privée créée précédement)</font>, et copiez/collez le texte du certificat affiché dans un nouveau fichier appelé C:\Projects\CodeSigning\Certum Code Signing.cer.

14. Installez votre véritable certificat

Il y a deux étapes nécessaires pour installer le nouveau certificat dans la base de données de certificats NSS.

 1. Installez le certificat racine de l'autorité émettrice
 2. Installez votre clé et votre certificat

La CA racine atteste de la validité de votre certificat. La plupart des émetteurs disposent de plusieurs CA racines en fonction de niveaux d'attestation. Trouvez celui qui a servi pour votre certificat et téléchargez le. Vous pouvez voir les détails de votre certificat dans Mozilla Firefox et obtenir cette information à partir de Emis par Nom commun (Unizeto Certum's free certificate CA is Certum Level I).

Téléchargez le CA racine et tous les certificats intermédiaires utilisés pour faire signer votre certificat par l'émetteur ; leur site Web ont un lien quelque part vers leur CA racine et leurs certificats publics (page de la clé publique de Certum). J'ai téléchargé le Certum Root CA et Certum Level I Digital ID for WWW and SSL/TLS Servers, copiez et sauvegardez le texte dans les fichiers C:\Projects\CodeSigning\Certum Root CA.cer et C:\Projects\CodeSigning\Certum Level I.cer.

Ouvrez une invite de commande (assurez vous que les chemins système vers les outils NSS soient définis comme à l'étape 5) dans le répertoire CodeSigning, installez les certificats de l'autorité CA, et vérifiez qu'ils ont été ajoutés correctement.

C:\Projects\CodeSigning> certutil -A -n "Certum Root CA" -t "TC,TC,TC" -d . -i "Certum Root CA.cer"

C:\Projects\CodeSigning> certutil -A -n "Certum Level I" -t "c,c,C" -d . -i "Certum Level I.cer"

C:\Projects\CodeSigning> certutil -L -d .
myTestCert                                                   u,u,Cu
Certum Root CA                                               CT,C,C
Certum Level I                                               CT,C,C

Le nom donné à ce nouveau certificat dans le jeu de clé de Mozilla Firefox n'est pas des plus simples à mémoriser, donc j'ai ajouté une étape supplémentaire pour vous permettre de le renommer (il ne s'agit malheureusement pas d'une simple opération de renommage).

Pour trouver le nom, rendez vous dans le gestionnaire de certificats de Mozilla Firefox (décrit à l'étape 11), choisissez Vos certificats, sélectionnez le nouveau certificat, appuyez sur Voir, choisissez Détails et examinez la première entrée de l'arborescence dans Champs du certificats.

Mon certificat Unizeto Certum s'appelle "TJ's Unizeto Sp. z o.o. ID" mais je veux l'appeler "Code Signing (Certum)".

L'astuce consiste à installer d'abord le certificat (sans la clé) pour vous permettre de choisir l'appellation à ce stade. Lorsque le couple clé/certificat est importé ensuite dans Mozilla Firefox, la clé privée sera ajoutée avec le nom certificat qui devra correspondre.

C:\Projects\CodeSigning> certutil -A -n "Code Signing (Certum)" -t "u,u,u" -d . -i "Certum Code Signing.cer"

C:\Projects\CodeSigning> certutil -L -d .
myTestCert                                                   u,u,Cu
Certum Root CA                                               CT,C,C
Certum Level I                                               CT,C,C
Code Signing (Certum)                                        ,,

C:\Projects\CodeSigning> signtool -l -d .
using certificate directory: .

Object signing certificates
---------------------------------------
myTestCert
    Issued by: myTestCert (XPI Test)
    Expires: Tue Mar 14, 2006
Code Signing (Certum)
    Issued by: Certum Level I (Certum Level I)
    Expires: Tue Mar 14, 2006
---------------------------------------
For a list including CA's, use "signtool -L"

Maintenant, vous devez exporter le nouveau couple clé/certificat de la base de données de certificats de Mozilla Firefox vers la base de données NSS.

Le plus difficile est de localiser la base de données des clés de Mozilla. Elle comprend deux fichiers appelés key3.db et cert8.db. Ils se situent habituellement dans le répertoire du profil utilisateur de Mozilla Firefox. Le mien se situait dans C:\Documents and Settings\TJ\Application Data\Mozilla\Firefox\Profiles\xxxxxxxx.default\ où xxxxxxxx est une chaîne de caractères aléatoires.

<font color="red">Cette procédure suppose que vous ayez installé le nouveau certificat dans Mozilla Firefox comme à l'étape 13.</font>

Voici les commandes nécessaires pour l'exporter vers un fichier, l'importer dans la base de données de signatures, et vérifier les attributs de signature (u,u,u). Pensez à utiliser le nom de votre certificat à la place du mien, et le répertoire où sont stockés les fichiers de la base de données de votre Mozilla Firefox :

C:\Projects\CodeSigning> pk12util -o "Certum Code Signing.pkcs12" -n "TJ's Unizeto Sp. z o.o. ID" -d "C:\Documents and Settings\TJ\Application Data\Mozilla\Firefox\Profiles\xxxxxxxx.default"
Enter password for PKCS12 file:
Re-enter password:
pk12util: PKCS12 EXPORT SUCCESSFUL

C:\Projects\CodeSigning> pk12util -i "Certum Code Signing.pkcs12" -d .
Enter Password or Pin for "NSS Certificate DB":
Enter password for PKCS12 file:
pk12util: PKCS12 IMPORT SUCCESSFUL

C:\Projects\CodeSigning> certutil -L -d .
myTestCert                                                   u,u,Cu
Certum Root CA                                               CT,C,C
Certum Level I                                               c,c,C
Code Signing (Certum)                                        u,u,u

Vous devriez noter que le certificat existant a été mis à jour.

15. Signez avec votre véritable certificat

C'est une répétition des étapes 8, 9 et 10 en utilisant les détails du véritable certificat. Voici le résultat sur un répertoire test :

C:\Projects\CodeSigning>signtool -d . -k "Code Signing (Certum)" -p ******* test
using certificate directory: .
Generating test/META-INF/manifest.mf file..
--> test.txt
Generating zigbert.sf file..
tree "test" signed successfully

<font color="red">Attention : L'outil de signature NSS n'inclut pas actuellement la chaîne de certificat dans le certificat (zigbert.rsa). Cela signifie que Firefox refusera d'installer du code signé grâce à une autorité de certification intermédiaire telle que Certum Level I à moins que l'utilisateur n'installe ce certificat dans Firefox d'abord. Le bug 322603 a été établi avec l'équipe NSS pour trouver un moyen de permettre à une chaîne de certification de servir pour signer un code. N'hésitez pas à poster des commentaires sur ce bug afin que l'équipe NSS sache que des personnes s'y intéressent.</font>

16. Incorporez une signature dans votre process de compilation

Vous pouvez incorporer ces étapes dans votre processus de compilation existant. Je dispose d'un fichier build.bat pour automatiser la création des fichiers jar et xpi. Cet exemple utilise l'outil bin/zip.exe de CygWin.

build.bat est placé dans le répertoire racine de l'extension. Par exemple

/dev/fsb/build.bat /dev/fsb/install.rdf /dev/fsb/chrome.manifest /dev/fsb/chrome/ /dev/fsb/chrome/content/ /dev/fsb/chrome/locale/ /dev/fsb/chrome/skin/

Voici ici le fichier avec les étapes inclues :

@echo off
set x=%cd%
echo Building %x%.xpi ...
echo Started at %DATE% %TIME% > %x%\build.log
md build\chrome
cd chrome
zip  -r -0 "%x%.jar" * >> %x%\build.log
move "%x%.jar" ..\build\chrome >> %x%\build.log
cd ..
copy install.rdf build >> %x%\build.log
copy chrome.manifest build >>%x%\build.log
signtool.exe -d C:\Projects\CodeSigning -k "Code Signing (Certum)" -p "password" build/ >> %x%\build.log
cd build
zip "%x%.xpi" META-INF/zigbert.rsa >> %x%\build.log
zip -r -D "%x%.xpi" * -x META-INF/zigbert.rsa >> %x%\build.log
rem copy "%x%.xpi" ..\..\..\http\fsb.xpi >> %x%\build.log
move "%x%.xpi" ..\ >> %x%\build.log
cd ..
rd build /s/q
echo Done.

Assurez vous de remplacer password avec votre mot de passe de la base de donnée de certification NSS.

Étiquettes et contributeurs liés au document

Contributeurs ayant participé à cette page : Kohei, Chbok, fscholz
Dernière mise à jour par : fscholz,