我有一个用于对 deb 进行签名并构建 repo 的脚本。下面是导致问题的相关代码:
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
这在 Ubuntu 14.04 上运行良好,但当我尝试在安装了 Ubuntu 16.04 的服务器上运行它时,出现以下错误:
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
Ubuntu 14.04 软件包:
- gnupg-1.4.16-1ubuntu2.3
- gnupg-代理 - 2.0.22-3ubuntu1.3
- gnupg2 - 2.0.22-3ubuntu1.3
- gpgv-1.4.16-1ubuntu2.3
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
我知道直接dpkg-sig
调用/usr/bin/gpg
,我曾经update-alternatives
设置/usr/bin/gpg
为gpg2
,但这会给我错误“设备 ioctl 不合适”。任何建议都很好,因为我已经为此烦恼了一段时间。
额外信息:
此脚本作为“Bamboo”上构建作业的一部分运行。密码作为环境变量传递,因为它被安全存储。但我并不想改变这个应用程序的管道。
答案1
您说密码短语${signPass}
来自某个安全存储。如果您可以安全地存储密码短语,那么您也可以存储带有无密码密钥安全。
将密钥的密码更改为空。您可以使用您最喜欢的钥匙串管理器或以下命令:
GNUPGHOME=... gpg2 --passwd user_id
将钥匙链存放在安全的存储空间中。
dpkg-sig
使用利用安全存储的密钥链的 GPG 选项运行:dpkg-sig --gpg-options "--secret-keyring /path/to/secret-keyring.gpg"
或者你可以使用密码文件直接地和dpkg-sig
(请参阅下面的编辑):
dpkg-sig -f /path/to/pass-phrase ...
您甚至可以使用标准输入:
printf '%s' "${signPass}" | dpkg-sig -f - ...
编辑:看来长期存在的错误破坏了-f
选项,但您可以通过以下方式解决它--gpg-options '--passphrase-file /path/to/pass-phrase'
(除了不能使用带有空格的密码文件名)。