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:
paquets Ubuntu 16.04:
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.
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é.
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
Stockez le porte-clés dans un stockage sécurisé.
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).