如何在 Ubuntu 16.04 中使用 dpkg-sig 和 GPG2 签署 Deb 包?

如何在 Ubuntu 16.04 中使用 dpkg-sig 和 GPG2 签署 Deb 包?

我有一个用于对 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/gpggpg2,但这会给我错误“设备 ioctl 不合适”。任何建议都很好,因为我已经为此烦恼了一段时间。

额外信息:

此脚本作为“Bamboo”上构建作业的一部分运行。密码作为环境变量传递,因为它被安全存储。但我并不想改变这个应用程序的管道。

答案1

您说密码短语${signPass}来自某个安全存储。如果您可以安全地存储密码短语,那么您也可以存储带有无密码密钥安全。

  1. 将密钥的密码更改为空。您可以使用您最喜欢的钥匙串管理器或以下命令:

    GNUPGHOME=... gpg2 --passwd user_id
    
  2. 将钥匙链存放在安全的存储空间中。

  3. 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'(除了不能使用带有空格的密码文件名)。

相关内容