Guide du développeur pour l'empaquetage d'applications

Création de packages signés

La procédure de création de packages signés implique un certain nombre d'étapes et nécessite la compréhension de nouveaux concepts et d'une nouvelle terminologie. Cette section fournit des informations sur les packages signés, la terminologie correspondante et des informations sur la gestion des certificats. Elle fournit également des procédures détaillées relatives à la création d'un package signé.

Packages signés

Un package signé est un package au format flux de données standard contenant une signature numérique (signature numérique PKCS7 au chiffrement PEM définie ci-après) qui garantit les points suivants :

La seule différence entre un package signé et un package non signé est sa signature ; Un package signé est compatible binaire avec un package non signé. De ce fait, un package signé peut être utilisé avec d'anciennes versions d'outils d'empaquetage. Toutefois, la signature est dans ce cas ignorée.

La technologie d'empaquetage signé emploie une nouvelle terminologie et de nouvelles abréviations décrites dans le tableau suivant :

Terme 

Définition 

ASN.1 

Langage de description de syntaxe abstraite (numéro 1) : Méthode d'expression d'objets abstraits. Par exemple, le langage ASN.1 définit un certificat à clé publique, l'ensemble des objets composant le certificat, et l'ordre dans lequel les objets sont recueillis. Toutefois, le langage ASN.1 n'indique pas la manière dont les objets sont sérialisés à des fins de stockage ou de transmission.

X.509 

Norme X.509 de l'UIT-T : Spécifie la syntaxe X.509 très répandue des certificats à clés publiques.

DER 

Distinguished Encoding Rules : Représentation binaire d'un objet ASN.1 qui définit la manière dont un objet ASN.1 est sérialisé à des fins de stockage ou de transmission dans les environnements informatiques. 

PEM 

Privacy Enhanced Message : Technique de chiffrement de fichier (au format DER ou autre format binaire) utilisant le codage 64 de base et quelques en-têtes facultatifs. La technique PEM était à l'origine utilisée pour le chiffrement d'e-mails de type MIME. La technique PEM est également largement utilisée pour le chiffrement des certificats et des clés privées d'un fichier stocké sur un système de fichiers ou joint à un message électronique.

PKCS7 

Norme de chiffrement par clé publique numéro 7 : Norme décrivant la syntaxe générale des données qu'il est possible de chiffrer, notamment les signatures numériques et les enveloppes numériques. Un package signé contient une signature PKCS7 incorporée. Cette signature contient au minimum la synthèse du package, ainsi que le certificat à clés publiques X.509 du signatatire. Le package signé peut également contenir des certificats à chaînes. Les certificats à chaînes peuvent être utilisés lors de la formation d'une chaîne de confiance, du certificat du signataire à un certificat de confiance stocké localement. 

PKCS12 

Norme de chiffrement par clé publique numéro 12 : Norme décrivant la syntaxe du stockage d'objets de chiffrement sur disque. Le keystore de package utilise ce format. 

Keystore de package 

Référentiel de certificats et de clés pouvant être interrogé par les outils d'un package. 

Gestion de certificats

Avant de créer un package signé, vous devez disposer d'un keystore de package. Ce keystore de package contient des certificats sous la forme d'objets. Un keystore de package contient deux types d'objets :

Certificat de confiance

Certificat de confiance contenant un seul certificat à clé publique appartenant à une autre entité. Le certificat de confiance est nommé ainsi parce que le propriétaire du keystore espère que la clé publique contenue dans le certificat appartient en effet à l'entité indiquée par le sujet (propriétaire) du certificat. L'émetteur du certificat garantit cette confiance en signant le certificat.

Les certificats de confiance sont utilisés lors de la vérification des signatures et lors de l'initialisation d'une connexion à un serveur sécurisé (SSL).

Clé utilisateur

Une clé utilisateur renferme toutes les informations sensibles de la clé de chiffrement. Ces informations sont stockées dans un format protégé pour empêcher tout accès non autorisé. Une clé utilisateur se compose de la clé privée d'un utilisateur et du certificat à clé publique correspondant à la clé privée.

Les clés utilisateur sont utilisées dans le cadre de la création d'un package signé.

Par défaut, le keystore du package est stocké dans le répertoire /var/sadm/security. Les utilisateurs peuvent disposer de leur propre keystore stocké par défaut dans le répertoire $HOME/.pkg/security.

Sur disque, un keystore de package peut utiliser deux formats : un format multifichier et un format monofichier. Un format multifichier stocke ses objets dans plusieurs fichiers. Chaque type d'objet est stocké dans un fichier distinct. Tous ces fichiers doivent être chiffrés à l'aide de la même phrase de passe. Un keystore monofichier stocke tous ses objets dans un seul fichier dans le système de fichiers.

Le principal utilitaire servant à gérer les certificats et le keystore du package est la commande pkgadm. Les sous-sections suivantes décrivent les opérations de gestion du keystore du package les plus courantes.

Ajout de certificats de confiance au keystore du package

Vous pouvez ajouter un certificat de confiance au keystore du package à l'aide de la commande pkgadm. Le certificat peut être au format PEM ou DER. Exemple :


$ pkgadm addcert -t /tmp/mytrustedcert.pem

Dans cet exemple, le certificat au format PEM appelé moncertdeconf.pem est ajouté au keystore du package.

Ajout d'un certificat utilisateur et d'une clé privée au keystore du package

La commande pkgadm ne génère pas de certificats utilisateur ni de clés privées. Les certificats utilisateur et les clés privées sont en général obtenus auprès d'une autorité de certification telle que Verisign. Ils sont aussi générés localement en tant que certificat autosigné. Une fois la clé et le certificat obtenus, vous pouvez les importer dans le keystore du package à l'aide de la commande pkgadm. Exemple :


pkgadm addcert -n myname -e /tmp/myprivkey.pem /tmp/mypubcert.pem

Dans cet exemple, les options suivantes sont utilisées :

-n monnom

Identifie l'entité (monnom) du keystore du package sur laquelle opérer. L'entité monnom devient l'alias sous lequel les objets sont stockés.

-e /tmp/maclépriv.pem

Spécifie le fichier contenant la clé privée. Dans ce cas, le fichier est maclépriv.pem, stocké dans le répertoire /tmp.

/tmp/moncertpub.pem

Indique le fichier de certificat au format PEM appelé moncertpub.pem.

Vérification du keystore du package

La commande pkgadm sert également à afficher le contenu du keystore du package. Exemple :


$ pkgadm listcert

Cette commande affiche les certificats de confiance et clés privées contenus dans le keystore du package.

Suppression de certificats de confiance et de clés privées du keystore d'un package

La commande pkgadm peut être utilisée pour supprimer des certificats de confiance et des clés privées du keystore du package.

Lorsque vous supprimez des certificats utilisateur, l'alias de la paire certificat/clé doit être spécifié. Exemple :


$ pkgadm removecert -n myname

L'alias du certificat correspond au nom usuel du certificat, qui peut être identifié à l'aide de la commande pkgadm listcert. Par exemple, la commande suivante supprime un certificat de confiance appelé Trusted CA Cert 1 :


$ pkgadm removecert -n "Trusted CA Cert 1"

Remarque –

Si un certificat de confiance et un certificat utilisateur sont stockés sous le même nom d'alias, ils sont tous deux supprimés lorsque vous spécifiez l'option -n.


Création de packages signés

La procédure de création de packages signés se déroule en trois étapes :

  1. Création d'un package non signé au format répertoire.

  2. Importation du certificat de signature, des certificats AC et de la clé privée dans le keystore du package.

  3. Signature du package de l'étape 1 avec les certificats de l'étape 2.


Remarque –

Les outils d'empaquetage ne créent pas de certificats. Ces certificats doivent être obtenus auprès d'une autorité de certification telle que Verisign ou Thawte.


Chaque étape de la création de packages signés est décrite dans les procédures suivantes.

ProcedureProcédure de création d'un package non signé au format répertoire

La procédure de création d'un package non signé au format répertoire est identique à la procédure de création d'un package standard décrite précédemment dans ce manuel. La procédure suivante décrit les étapes de la création d'un package non signé au format répertoire. Pour plus d'informations, reportez-vous aux sections précédentes relatives à la création des packages.

  1. Créez le fichier pkginfo.

    Le fichier pkginfo doit avoir le contenu de base suivant :


    PKG=SUNWfoo
    BASEDIR=/
    NAME=My Test Package
    ARCH=sparc
    VERSION=1.0.0
    CATEGORY=application
  2. Créez le fichier prototype.

    Le fichier prototype doit avoir le contenu de base suivant :


    $cat prototype
    i pkginfo
    d none usr 0755 root sys
    d none usr/bin 0755 root bin
    f none usr/bin/myapp=/tmp/myroot/usr/bin/myapp 0644 root bin
  3. Répertoriez le contenu du répertoire source des objets.

    Exemple :


    $ ls -lR /tmp/myroot
    

    Le résultat pourrait être comme suit :


    /tmp/myroot:
    total 16
    drwxr-xr-x   3 abc      other        177 Jun  2 16:19 usr
    
    /tmp/myroot/usr:
    total 16
    drwxr-xr-x   2 abc      other        179 Jun  2 16:19 bin
    
    /tmp/myroot/usr/bin:
    total 16
    -rw-------   1 abc      other       1024 Jun  2 16:19 myapp
  4. Créez le package non signé.


    pkgmk -d `pwd`
    

    Le résultat peut être comme suit :


    ## Building pkgmap from package prototype file.
    ## Processing pkginfo file.
    WARNING: parameter <PSTAMP> set to "syrinx20030605115507"
    WARNING: parameter <CLASSES> set to "none"
    ## Attempting to volumize 3 entries in pkgmap.
    part  1 -- 84 blocks, 7 entries
    ## Packaging one part.
    /tmp/SUNWfoo/pkgmap
    /tmp/SUNWfoo/pkginfo
    /tmp/SUNWfoo/reloc/usr/bin/myapp
    ## Validating control scripts.
    ## Packaging complete.

    Le package se trouve dorénavant dans le répertoire actuel.

ProcedureProcédure d'importation des certificats dans le keystore du package

Le certificat et la clé privée à importer doivent être un certificat X.509 et une clé privé chiffrés au format PEM ou DER. En outre, tout certificat intermédiaire ou à chaînes liant votre certificat de signature à l'autorité de certification doit être importé dans le keystore du package avant la signature d'un package.


Remarque –

Chaque autorité de certification peut établir des certificats dans divers formats. Pour extraire les certificats et la clé privée du fichier PKCS12 et les importer dans le fichier X.509 chiffré au format PEM (approprié à l'importation dans le keystore du package), servez-vous d'un utilitaire de conversion en freeware tel que OpenSSL.


Si votre clé privée est chiffrée (ce qui est habituellement le cas), un message vous invite à saisir la phrase de passe. Un autre message vous invite par ailleurs à saisir un mot de passe afin de protéger le keystore du package résultant. Ce mot de passe n'est pas obligatoire mais sans mot de passe, le keystore du package n'est pas chiffré.

La procédure suivante décrit l'importation des certificats à l'aide de la commande pkgadm une fois convertis au format approprié.

  1. Importez tous les certificats fournis par l'autorité de certification situés dans votre fichier de certificats X.509 chiffrés au format PEM ou DER.

    Par exemple, pour importer tous les certificats de l'autorité de certification situés dans le fichier ca.pem, vous devez saisir la commande suivante :


    $ pkgadm addcert -k ~/mykeystore -ty ca.pem
    

    Le résultat peut être comme suit :


    Trusting certificate <VeriSign Class 1 CA Individual \
    Subscriber-Persona Not Validated>
    Trusting certificate </C=US/O=VeriSign, Inc./OU=Class 1 Public \
    Primary Certification Authority
    Type a Keystore protection Password.
    Press ENTER for no protection password (not recommended): 
    For Verification: Type a Keystore protection Password.
    Press ENTER for no protection password (not recommended): 
    Certificate(s) from <ca.pem> are now trusted

    Pour importer votre clé de signature dans le keystore du package, vous devez fournir un alias qui sera utilisé ultérieurement lors de la signature du package. Cet alias peut également être utilisé pour supprimer la clé du keystore du package.

    Par exemple, pour importer votre clé de signature à partir du fichier sign.pem, vous devez saisir la commande suivante :


    $ pkgadm addcert -k ~/mykeystore -n mycert sign.pem
    

    Le résultat peut être comme suit :


    Enter PEM passphrase:
    Enter Keystore Password: 
    Successfully added Certificate <sign.pem> with alias <mycert>
  2. Vérifiez que les certificats se trouvent dans le keystore du package.

    Par exemple, pour afficher les certificats contenus dans le keystore créé à l'étape précédente, vous devez saisir la commande suivante :


    $ pkgadm listcert -k ~/mykeystore
    

ProcedureProcédure de signature du package

Une fois les certificats importés dans le keystore du package, le package peut être signé. La signature du package en tant que telle s'effectue à l'aide de la commande pkgtrans.

  1. Signez le package à l'aide de la commande pkgtrans. Indiquez l'emplacement du package non signé et l'alias de la clé pour signer le package.

    Par exemple, en partant des exemples des procédures précédentes, vous devez saisir la commande suivante pour créer un package signé appelé SUNWfoo.signed :


    $ pkgtrans -g -k ~/mykeystore -n mycert . ./SUNWfoo.signed SUNWfoo
    

    Le résultat de cette commande peut être comme suit :


    Retrieving signing certificates from keystore </home/user/mykeystore>
    Enter keystore password:
    Generating digital signature for signer <Test User>
    Transferring <SUNWfoot> package instance

    Le package signé est créé dans le fichier SUNWfoo.signed, au format flux de données de package. Ce package signé peut être copié sur un site Web et, installé à l'aide de la commande pkgadd et d'une URL.