Faire un dépot signé ou non

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche

Présentation

Ce petit document indique comment faire un dépot signé ou non

  1. Prérequis
  2. Configuration
  3. Fabrication des fichiers Packages
  4. Fabrication du fichier Release
  5. Signature du dépot

Ce document est fondé sur la gestion de mes dépots non signés et signés suivant
deb http://boisson.homeip.net/debian/ wheezy divers
deb http://boisson.homeip.net/depot/ wheezy divers

Il est possible de voir concrètement les fichiers en allant sur le site correspondant.

Prérequis

Il existe des logiciels permettant de fabriquer et de gérer des dépots, par exemple reprepro. Ce qui suit ne fait qu'utiliser les logiciels d'apt-utils. Il suffit d'avoir donc apt-utils d'installé ainsi que gpg si vous comptez signer le dépot.

Un dépot est vu dans le sources.list par une ligne du type

deb http://boisson.homeip.net/depot wheezy divers

On y distingue l'adresse (http://boisson.homeip.net/depot), la version (wheezy ici, parmi toutes les versions du dépot) et la composante (divers ici, parmi toutes les composantes du dépot, souvent c'est main mais vous avez le droit d'être précis).

apt-cache policy montre

500 http://boisson.homeip.net/depot/ wheezy/divers amd64 Packages
    release o=Depot F. Boisson,a=wheezy,l=boisson.homeip.net,c=divers
    origin boisson.homeip.net

On y retrouve l'adresse, les couples composantes/version et l'architecture concernée.

Le dépot aura une arborescence de ce type (. est /var/www/depot par exemple):

. -> dists -> divers --> binary-amd64
  |         |        |-> binary-i386
  |         |-> nvidia --> binary-amd64
  |         |          |-> binary-i386
  |         |-> pouet (etc)
  |-> pool --> divers --> amd64 (paquets de divers/amd64)
          |          |-> i386 (paquets de divers/i386)
          |-> nvidia --> amd64 (paquets de nvidia/amd64)
          |          |-> i386 (paquets de nvidia/i386)
          |-> pouet --> amd64 (etc)

(ici il y a 3 composantes au moins: divers, nvidia, pouet)

Les paquets sont sous pool dans les répertoires composante/architecture. La description de chaque composante est dans un fichier Packages sous composante/binary-<architecture>

Configuration

Celle ci consiste à mettre pour chaque version un fichier version.conf (par exemple wheezy.conf) dans le répertoire racine du dépot. Par exemple:

APT::FTPArchive::Release {
  Origin                "Depot F. Boisson";
  Label                 "boisson.homeip.net";
  Suite                 "wheezy";
  Architectures         "i386 amd64";
  Components            "divers";
}

On y voit l'origine (description du dépot) qui apparait dans le champ «o=» lors du apt-cache policy, le label («l=»), lsuite ou version («a=») les architectures et les composantes concernées.

Il est tout à fait possible de faire cohabiter des dépots ubuntu et debian tant que les noms des versions diffèrent.

Fabrication des fichiers Packages

Pour chaque version, et pour chaque composante, il y a un fichier Packages et ses versions compressées correspondantes. Ce fichier s'obtient par dpkg-scanpackages ou, de façon plus pratique, par apt-ftparchive packages

apt-ftparchive packages pool/divers/wheezy/i386/ > dists/wheezy/divers/binary-i386/Packages
apt-ftparchive packages pool/divers/wheezy/amd64/ > dists/wheezy/divers/binary-amd64/Packages

puis leur versions compressées

cat dists/wheezy/divers/binary-i386/Packages | gzip > dists/wheezy/divers/binary-i386/Packages.gz
cat dists/wheezy/divers/binary-i386/Packages | bzip2 > dists/wheezy/divers/binary-i386/Packages.bz2
cat dists/wheezy/divers/binary-amd64/Packages | gzip > dists/wheezy/divers/binary-amd64/Packages.gz
cat dists/wheezy/divers/binary-amd64/Packages | bzip2 > dists/wheezy/divers/binary-amd64/Packages.bz2

Ce fichier Packages contient la liste des paquets avec leur description et les md5sum et autres sha. Par exemple

Package: jpegtoavi
Priority: optional
Section: unknown
Installed-Size: 64
Maintainer: Fran�ois Boisson <xxx@yyy.zz.tt>
Architecture: amd64
Version: 1.5-1
Depends: libc6 (>= 2.2.5)
Filename: pool/wheezy/amd64/jpegtoavi_1.5-1_amd64.deb
Size: 9072
MD5sum: efb15d19f16ab29513f89d2650dc6258
SHA1: 6d798d93f780fae827152725bc3c53baccea5743
SHA256: d2598b36e0b633968ff260372ea0870c2d7c31177ffa6a5c0679c32291e3e3ef
Description: Conversion jpeg -> avi
 Farbication de fichiers AVI � partir de JPEG

La fabrication de ce fichier prend du temps si le dépot contient beaucoup de fichiers .deb. Cela peut prendre facilement plusieurs minutes.

Fabrication du fichier Release

Cela doit être fait une fois tous les fichiers Packages crées. Le fichier Release contient, outre la description du dépot (un fichier Release pour chaque version). Il contient un md5sum (et sha) de chaque fichier sous dists/version donc entre autres des fichiers Packages. La sureté de ce fichier permet de certifier les fichiers Packages donc les paquets.

Ce fichier se crée par

apt-ftparchive -c wheezy.conf release dists/wheezy/ > /tmp/Release
mv /tmp/Release dists/wheezy/Release

(procédez en deux étapes pour que ce fichier n'apparaisse pas dans son contenu, je pense que apt-get s'en moque mais je n'ai pas vérifié). La première commande fabrique le fichier dans /tmp/Release, le fichier de configuration dans cet exemple est wheezy.conf. Il est important de bien renseigner les différentes composantes du dépot.

Typiquement son contenu est

Architectures: i386 amd64
Components: divers nvidia owncloud
Date: sam., 27 oct. 2012 13:04:59 UTC
Label: boisson.homeip.net
Origin: Depot F. Boisson
Suite: wheezy
MD5Sum:
 453b37a21882aae6eb4e5c2f87fb9336             2100 Release
 c067f73427faf97f5dfea9c7599e9ef3            25244 divers/binary-amd64/Packages
 626a8959586c23d90dad380058e20d7b             8269 divers/binary-amd64/Packages.bz2
 2466296dd049595904d266b663c9c616             8380 divers/binary-amd64/Packages.gz
 db0d79b76433fa614892146d60f5a8e2            22963 divers/binary-i386/Packages
 4041ce2e5f46ec25c61785bb5bbdea3c             6874 divers/binary-i386/Packages.bz2
 8e9c3fa27d07499febd42aff23588e13             6861 divers/binary-i386/Packages.gz
 f28c024f1491e206205098582f8e9a2b            34519 nvidia/binary-amd64/Packages
 360c602b0a4a865dd37e2b2cc1738260             7466 nvidia/binary-amd64/Packages.bz2
 d03982d9d41e82311c09a306e8d37883             7717 nvidia/binary-amd64/Packages.gz
 73f1b1fd3ec0d7b20a185bca293af92d            30768 nvidia/binary-i386/Packages
 70877482f19b88b882039374ff2c6e2b             7080 nvidia/binary-i386/Packages.bz2
....

Signature du dépot

Il suffit désormais de signer le dépot donc de signer le fichier Release ce qui garantira les fichiers Packages et donc les paquets eux mêmes. Cela se fait tout simplement par

gpg --sign -ba -o Release.gpg Release

À noter qu'il faut mettre la signature sur un serveur de clefs, typiquement si vous signez avec la clef

pub 1024D/CEA8D8FF 2012-10-27

il vous suffit de faire

gpg --keyserver pgpkeys.mit.edu --send-key CEA8D8FF

en notant qu'il faudra peut être ouvrir un port sur l'extérieur (usuellement la réponse est très rapide)

L'utilisateur, si il n'a pas votre clef, verra

Il pourra récupérer la clef par les classiques

gpg --keyserver pgpkeys.mit.edu --recv-key D78A5C23CEA8D8FF

qui récupère la clef sur le serveur et

gpg -a --export D78A5C23CEA8D8FF > /tmp/clef.txt
et sous root
apt-key add /tmp/clef.txt

Un script

Ce script updatedepot permet de faire la suite des opérations automatiquement dès que les fichiers versions.conf ont été crées:

#!/bin/sh
VERSION=$1
DISTRIBUTION=depot
if [ ! -z $2 ] ; then
DISTRIBUTION=$2
fi
LISTE=$(grep Component $VERSION.conf | sed 's/^.*"\(.*\)".*$/\1/')
echo $LISTE
cd /var/www/$DISTRIBUTION
# consultation de divers
for nom in $LISTE ; do
echo Fabrication de $nom
mkdir -p dists/$VERSION/$nom/binary-i386/
mkdir -p dists/$VERSION/$nom/binary-amd64/
apt-ftparchive packages pool/$VERSION/$nom/i386/ | gzip > dists/$VERSION/$nom/binary-i386/Packages.gz
zcat dists/$VERSION/$nom/binary-i386/Packages.gz | bzip2 > dists/$VERSION/$nom/binary-i386/Packages.bz2
zcat dists/$VERSION/$nom/binary-i386/Packages.gz >dists/$VERSION/$nom/binary-i386/Packages
apt-ftparchive packages pool/$VERSION/$nom/amd64/ | gzip > dists/$VERSION/$nom/binary-amd64/Packages.gz
zcat dists/$VERSION/$nom/binary-amd64/Packages.gz | bzip2 >dists/$VERSION/$nom/binary-amd64/Packages.bz2
zcat dists/$VERSION/$nom/binary-amd64/Packages.gz >dists/$VERSION/$nom/binary-amd64/Packages
done
apt-ftparchive -c $VERSION.conf release dists/$VERSION/ > /tmp/Release.tmp
mv /tmp/Release.tmp dists/$VERSION/Release
cd dists/$VERSION/
rm Release.gpg
gpg --sign -ba -o Release.gpg Release

Il s'utilise par

$ updatedepot wheezy depot

si wheezy est la version choisie et /var/www/depot l'emplacement du dépot.
Ce fichier lit le fichier version.conf, en dégage les composantes voulues et fait toute la suite des opérations. Ça s'avère pratique en cas de modifications fréquentes du dépot.