web-dev-qa-db-fra.com

Comment signer un paquet Deb avec dpkg-sig et GPG2 dans Ubuntu 16.04?

J'ai un script qui est utilisé pour signer un deb et construire un repo. Le code approprié est ci-dessous qui cause des problèmes:

export GNUPGHOME=foo/gnupg/
killall -q gpg-agent
eval $(gpg-agent --daemon --homedir $GNUPGHOME --allow-preset-passphrase)
echo ${signPass} | /usr/lib/gnupg2/gpg-preset-passphrase --preset $fingerprint
dpkg-sig -g '--no-tty' --sign builder bar/baz/app.deb

Cela fonctionne sur Ubuntu 14.04 mais dès que j'essaie de l'exécuter sur un serveur sur lequel Ubuntu 16.04 est installé, je reçois les erreurs suivantes:

dpkg-deb: building package 'app' in 'bar/baz/app.deb'.
Processing bar/baz/app.deb..
gpg: gpg-agent is not available in this session
gpg: Sorry, no terminal at all requested - can't get input
E: Signing failed. Error code: 512

paquets Ubuntu 14.04:

  • gnupg - 1.4.16-1ubuntu2.3
  • gnupg-agent - 2.0.22-3ubuntu1.3
  • gnupg2 - 2.0.22-3ubuntu1.3
  • gpgv - 1.4.16-1ubuntu2.3

paquets Ubuntu 16.04:

  • gnupg - 1.4.20-1ubuntu3.1
  • gnupg-agent 2.1.11-6ubuntu2
  • gnupg2 - 2.1.11-6ubuntu2
  • gpgv - 1.4.20-1ubuntu3.1
  • gpgv2 - 2.1.11-6ubuntu2

Je sais que dpkg-sig appelle /usr/bin/gpg directement, et j’ai utilisé update-alternatives pour définir /usr/bin/gpg sur gpg2 mais cela me donne des erreurs avec “inappropiate ioctl for device ”. Toutes les suggestions seraient formidables, car je me suis cogné la tête pendant un moment.

Extra Info:

Ce script est exécuté dans le cadre d'un travail de création sur 'Bamboo'. Le mot de passe est transmis en tant que variable d'environnement, car il est stocké de manière sécurisée. Je ne cherche toutefois pas à modifier le pipeline de cette application.

1
BelieveMe

Vous dites que la phrase de passe dans ${signPass} provient d'un stockage sécurisé. Si vous pouvez stocker une phrase secrète en toute sécurité, vous pouvez également stocker une chaîne de clés avec clé secrète sans mot de passe en toute sécurité.

  1. Changez le mot de passe de la clé pour le vider. Vous pouvez utiliser votre gestionnaire de chaîne de clés préféré ou la commande suivante:

    GNUPGHOME=... gpg2 --passwd user_id
    
  2. Stockez le porte-clés dans un stockage sécurisé.

  3. Exécutez dpkg-sig avec les options GPG qui utilisent la chaîne de clés stockée de manière sécurisée:

    dpkg-sig --gpg-options "--secret-keyring /path/to/secret-keyring.gpg"
    

Vous pouvez également utiliser un fichier de phrase secrète directement ​​avec dpkg-sig ( voir l'édition ci-dessous ):

dpkg-sig -f /path/to/pass-phrase ...

Vous pouvez même utiliser une entrée standard:

printf '%s' "${signPass}" | dpkg-sig -f - ...

Edit: Il semble qu'un bogue de longue date casse l'option -f mais vous pouvez la contourner via --gpg-options '--passphrase-file /path/to/pass-phrase' (sauf que vous ne pouvez pas utiliser de noms de fichier de phrase secrète avec des espaces).

2
David Foerster