Attention : Le contenu de ces pages n'a pas été mis à jour depuis longtemps. Il est probablement obsolète pour Firefox 4.0/Gecko 4.0 et supérieur. Pour du contenu plus récent, allez consulter developer.mozilla.org.

Signer une appli

À quoi ça sert ?

Lorsqu'on accède à un document HTML ou XUL situé sur un serveur, les scripts Javascript contenus dans ces pages ont certaines restrictions. Ils ne peuvent pas par exemple accéder aux fichiers de votre disque dur pour des raisons évidentes de sécurité.

Les scripts signés permettent de s'affranchir de ces restrictions.

Comment ça marche ?

Les scripts signés et les documents HTML, XUL associés sont stockés dans une archive au format ZIP portant une extension .jar. L'accès aux fichiers contenus dans cette archive se fait par le biais d'un protocole spécial (jar:). L'URL a cette forme :

   jar:http://www.unsite.com/unearchivejar.jar!/unscriptsigné.html

L'archive est signé à l'aide d'un utilitaire nommé signtool qui fait partie des outils NSS (Network Security Services). L'archive doit être resignée à chaque modification des scripts.

Les certificats

Pour signer des scripts vous avez besoin d'un certificat. C'est un fichier qui vous est remis par un tiers (ou que vous pouvez créer vous-même). Ce dernier se porte garant de la « non nocivité » du contenu de vos scripts.

Installation des outils NSS

Sous Linux

Votre distribution propose certainement un paquet contenant les outils NSS. Par exemple, sous Mandriva 2006, vous savez un paquet « nss-3.9.2-1mdk ». Installez-le comme vous avez l'habitude de faire. Vérifiez ensuite qu'en tapant en ligne de commande

  certutil --help

vous n'ayez pas d'erreur. Si tout est ok, passez à la section suivante, « signer vos scripts ».

Si vous n'avez pas de paquet correspondant, suivez les instructions :

  1. Téléchargez la dernière version de NSS depuis ftp://ftp.mozilla.org/pub/mozilla.org/se(..) .
  2. Décompressez la dans un répertoire quelconque temporaire
  3. recopiez le contenu du repertoire nss/bin dans /usr/bin et celui de nss/lib dans /usr/lib (peut être vous faudra-t-il vous identifier sous root).

Tapez :

  certutil --help

Si il n'y a pas de message d'erreur, c'est prêt.

Sous Windows

  1. Téléchargez la dernière version de NSS depuis : ftp://ftp.mozilla.org/pub/mozilla.org/se(..)
  2. Décompressez l'archive obtenue dans un répertoire (« c:/NSS » pour Windows par exemple). Évitez les chemins alambiqués (longs ou avec des espaces) car nous allons travailler en ligne de commande. Après décompression, vous devriez obtenir l'arborescence suivante :
 nss -+- bin
      +- include
      +- lib

Ouvrez un terminal ou une fenêtre DOS et placez vous dans « bin ».

  cd nss\bin

Certaines DLL nécessaires au fonctionnement des utilitaires se trouvent dans « lib ». Déplacez les dans « bin ».

  move ..\lib\*.* .

Vous avez également besoin de certaines DLL de Mozilla. Copiez les dans bin.

  copy "C:\Program Files\mozilla.org\Mozilla\*.dll" .

Voilà, les outils NSS sont prêts à fonctionner.

Créer un certificat

Création d'une base de données

Créez un répertoire « CA » dans votre $HOME (Linux) ou par exemple dans le répertoire « C:/nss/bin/ » (Windows). Il servira à stocker les certificats que nous allons créer.

Toutes les manipulations sur les certificats se font à l'aide de l'utilitaire certutil. Pour créer une base de données, nous lui passons l'option « -N ». L'option « -d » permet de spécifier le répertoire dans lequel la base de données est placée (notre répertoire « CA » donc…).

 certutil -N -d CA
 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:

Vous devez choisir un mot de passe qui permettra de chiffrer vos clés. Après ça, 3 fichiers vont être créés dans « CA/ » : cert8.db, key3.db et secmod.db.

Création d'un certificat racine

Le certificat racine est le certificat qui est à la base de tous les autres que vous allez créer pour votre application. Il vous identifie en quelque sorte. Il ne doit être donné à personne.

Pour créer notre certificat racine, nous utilisons « certutil » avec les options suivantes :

  1. L'option « -S » permet de créer un certificat et de l'ajouter à la base.
  2. L'option « -d » pour spécifier l'emplacement de cette dernière.
  3. L'option « -s » (subject) correspond à l'objet du certificat. CN » correspond à Common Name. C'est le nom commun du certificat. O correspond à Organisation, vous indiquez donc ici le nom de votre société ou de votre secte ;-).
  4. L'option « -n » permet de spécifier le nom interne du certificat.
  5. L'option « -v » permet de préciser le nombre de mois pendant lesquels le certificat sera valable. Un certificat est toujours valable au moins 3 mois. Lorsque vous indiquez un nombre de mois avec l'option « -v », ces 3 mois sont ajoutés. « -v 96 » signifie donc que le certificat pourra être utilisé pour signer des applications pour une durée de 99 mois.

Pour les autres options, consultez la documentation de « certutil » à l'adresse : http://www.mozilla.org/projects/security(..)

  certutil -S -d CA -s "CN=xulfr.org root CA, O=xulfr.org" -n "xulfr.org" -t ",,C" -v 96 -x -1 -2 -5
 A random seed must be generated that will be used in the
 creation of your key.  One of the easiest ways to create a
 random seed is to use the timing of keystrokes on a keyboard.
 To begin, type keys on the keyboard until this progress meter
 is full.  DO NOT USE THE AUTOREPEAT FUNCTION ON YOUR KEYBOARD!
 Continue typing until the progress meter is full:
 |                                            |

On vous demande de taper de façon aléatoire sur votre clavier pour générer une graine aléatoire qui permettra par la suite de générer une clé. tapez donc au hasard sur votre clavier jusqu'à ce que la barre soit remplie de « * ».

 |************************************************************|
 Finished.  Press enter to continue:

Tapez « Entrée ».

 Enter Password or Pin for "NSS Certificate DB":

Entrez le mot de passe que vous avez indiqué lors de la création de la base de donnée, puis taper sur « Entrée ».

 Generating key.  This may take a few moments...
                          0 - Digital Signature
                          1 - Non-repudiation
                          2 - Key encipherment
                          3 - Data encipherment
                          4 - Key agreement
                          5 - Cert signing key
                          6 - CRL signing key
                          Other to finish

On veut une clé de certificat. Tapez « 5 » puis « Entrée ». Le menu s'affiche à nouveau.

                          0 - Digital Signature
                          1 - Non-repudiation
                          2 - Key encipherment
                          3 - Data encipherment
                          4 - Key agreement
                          5 - Cert signing key
                          6 - CRL signing key
                          Other to finish

Tapez « 9 » pour terminer, puis « Entrée ». Répondez alors aux questions qui suivent, comme indiqué :

 Is this a critical extension [y/n]?
 y
 Is this a CA certificate [y/n]?
 y
 Enter the path length constraint, enter to skip [<0 for unlimited path]:
 3
 Is this a critical extension [y/n]?
 y
                          0 - SSL Client
                          1 - SSL Server
                          2 - S/MIME
                          3 - Object Signing
                          4 - Reserved for futuer use
                          5 - SSL CA
                          6 - S/MIME CA
                          7 - Object Signing CA
                          Other to finish
 7
                          0 - SSL Client
                          1 - SSL Server
                          2 - S/MIME
                          3 - Object Signing
                          4 - Reserved for futuer use
                          5 - SSL CA
                          6 - S/MIME CA
                          7 - Object Signing CA
                          Other to finish
 9
 Is this a critical extension [y/n]?
 y

Vérifiez que votre certificat a bien été créé avec l'option « -L » de « certutil ».

 certutil -L -d CA
 xulfr.org                                                    u,u,Cu

Création d'un certificat pour signer un objet

Nous devons d'abord créer un fichier de requête, « req.txt » dans le répertoire « CA ». Attention, dans la ligne de commande qui suit, vous devez mettre « CA\req.txt » si vous êtes sous Windows, sinon « CA/req.txt ».

 certutil -R -d CA -o CA\req.txt -a -s "CN=object signing cert, O=xulfr.org" -v 95
 A random seed must be generated that will be used in the
 creation of your key.  One of the easiest ways to create a
 random seed is to use the timing of keystrokes on a keyboard.
 To begin, type keys on the keyboard until this progress meter
 is full.  DO NOT USE THE AUTOREPEAT FUNCTION ON YOUR KEYBOARD!
 Continue typing until the progress meter is full:
 |************************************************************|
 Finished.  Press enter to continue:
 Enter Password or Pin for "NSS Certificate DB":
 Generating key.  This may take a few moments...

Vous devez à présent avoir un fichier nommé « req.txt » dans le répertoire « CA ». Nous allons créer notre certificat à partir de ce dernier (attention toujours à « CA/ »).

 certutil -C -d CA -c "xulfr.org" -i CA\req.txt -a -o CA\cert.txt -1 -2 -5 -v 96
                          0 - Digital Signature
                          1 - Non-repudiation
                          2 - Key encipherment
                          3 - Data encipherment
                          4 - Key agreement
                          5 - Cert signing key
                          6 - CRL signing key
                          Other to finish
 0
                          0 - Digital Signature
                          1 - Non-repudiation
                          2 - Key encipherment
                          3 - Data encipherment
                          4 - Key agreement
                          5 - Cert signing key
                          6 - CRL signing key
                          Other to finish
 9
 Is this a critical extension [y/n]?
 y
 Is this a CA certificate [y/n]?
 n
 Enter the path length constraint, enter to skip [<0 for unlimited path]:
 -1
 Is this a critical extension [y/n]?
 y
                          0 - SSL Client
                          1 - SSL Server
                          2 - S/MIME
                          3 - Object Signing
                          4 - Reserved for futuer use
                          5 - SSL CA
                          6 - S/MIME CA
                          7 - Object Signing CA
                          Other to finish
 3
                          0 - SSL Client
                          1 - SSL Server
                          2 - S/MIME
                          3 - Object Signing
                          4 - Reserved for futuer use
                          5 - SSL CA
                          6 - S/MIME CA
                          7 - Object Signing CA
                          Other to finish
 9
 Is this a critical extension [y/n]?
 y
 Enter Password or Pin for "NSS Certificate DB":

Vous devez à présent avoir un fichier nommé « cert.txt » dans le répertoire « CA ». Ajoutons-le à la base avec la commande suivante :

  certutil -A -d CA -n "object signer" -i CA\cert.txt -a -t "u,u,u"

Vérifions :

  certutil -L -d CA
 xulfr.org                                                    u,u,Cu
 object signer                                                u,u,u

Signature des scripts

Vous devez placer vos scripts dans un sous répertoire et ensuite lancer :

 > signtool -d CA -k "object signer" -p "votreMotDePasse" -Z votreApplication.jar repertoireDeVotreApplication
 using certificate directory: CA
 Generating repertoireDeVotreApplication//META-INF/manifest.mf file..
 --> votreApplication.js
 adding repertoireDeVotreApplication//votreApplication.js to  votreApplication.jar...(deflated 27%)
 --> votreApplication.xul
 adding repertoireDeVotreApplication//votreApplication.xul to      votreApplication.jar...(deflated 31%)
 Generating zigbert.sf file..
 adding repertoireDeVotreApplication//META-INF/manifest.mf to votreApplication.jar...(deflated 29%)
 adding repertoireDeVotreApplication//META-INF/zigbert.sf to votreApplication.jar...(deflated 36%)
 adding repertoireDeVotreApplication//META-INF/zigbert.rsa to votreApplication.jar...(deflated 19%)
 tree "repertoireDeVotreApplication/" signed successfully

Installation du certificat racine sur le client

Pour installer le certificat racine sur les postes clients nous devons l'exporter sous la forme d'un fichier « .cacert ».

  certutil -L -d CA -n "xulfr.org" -a -o CA\xulfr.cacert

Ensuite vous pouvez : # soit mettre le fichier en question en téléchargement sur un serveur Web (voir ApplisWeb/ConfigurationDuServeurWeb pour la reconnaissance correcte de l'extension cacert par votre serveur et Mozilla) # soit l'importer dans Mozilla ou Firefox avec le gestionnaire de certicats

  • *Dans Mozilla** : menu déroulant Édition -> Préférences… , catégorie Confidentialité et Sécurité -> Certificats, bouton Gestion des certificats. Après l'installation, votre certificat devrait apparaitre dans l'onglet Autorités du gestionnaire de certificats.
  • *Dans Firefox** : menu déroulant Édition -> Préférences -> onglet Avancé puis Sécurité -> bouton Voir certificats -> onglet Authorities -> bouton import. Aprés avoir choisi le fichier en question, indiquée que vous voulez que le certificat identifie des sites web. Après l'installation, votre certificat devrait apparaitre dans l'onglet Authorities.

Test

Nous allons utiliser le document XUL suivant :

 <?xml version="1.0"?>
 <?xml-stylesheet href="[[chrome://global/skin/]]" type="text/css"?>
 <window
   onload="init()"
   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 <script src="hello.js" type="application/x-javascript" />
 <label id="hello" value=""/>
 </window>

et le script correspondant :

 1 function init()
 2 {
 3   try {
 4     netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
 5     document.getElementById('hello').value = 'Privileges enabled';
 6   } catch(e) {
 7     alert(e);
 8   }
 9 }

À la ligne 4, nous demandons l'activation d'un privilège. Si la signature est bonne nous aurons le message « Privileges enabled » qui s'affichera. Dans le cas contraire, vous serez gratifié d'un message d'erreur.

Placez ces deux fichiers (nommez les « hello.xul » et « hello.js ») dans un répertoire, signez ce dernier et placez l'archive jar obtenue sur un serveur web. Ensuite vous devriez pouvoir y accédez avec le protocole jar. Par exemple : jar:http://127.0.0.1/hello.jar!/hello.xul

Si ça ne marche pas consultez la console Javascript pour voir si il y a une erreur.

Références

  1. Les scripts signés dans Mozilla : http://www.mozilla.org/projects/security(..)
  2. Les outils NSS : http://www.mozilla.org/projects/security(..)
  3. Un document qui explique comment créer ses propres certificats pour signer ses scripts : http://certs.mozdev.org/cadraft.html
  4. Documentation de certutil : http://www.mozilla.org/projects/security(..)

Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.