如何在GPG签名dpkg-buildpackage时自动化密码短语?

我正在使用dpkg-buildpackage,并希望完全自动化我的脚本,但我找不到如何GPG签名软件包并自动输入密码短语到我的持续集成系统中。我不想使用“-us -uc”参数,因为我确实想要对它们进行签名。
有什么建议吗?

也许可以使用 debsign 来解决问题,参见这个答案 - Raffi
5个回答

如果你的钥匙串已经解锁,你只需要做以下操作:
设置 gpg-agent 这样你就不会被多次提示输入密码... sudo aptitude install gnupg-agent pinentry-gtk2 pinentry-curses 用你的 GPG 密钥 ID 替换 0xD34DB33F export GPGKEY=0xD34DB33F killall -q gpg-agent eval $(gpg-agent --daemon)
并且
export DEBEMAIL="address@example.com" export DEBFULLNAME="Your full name as it appears on the GPG key"
来自这里 我可以证明第二部分的有效性。第一部分是复制粘贴,但看起来是合法的。我认为你仍然需要解锁密钥一次,但它会保持解锁状态。

如何使其持久化?代理在每次构建时都会询问。 - Velkan

注释掉:
use-agent

在`~/.gnupg/gpg.conf`中。并且
dpkg-buildpackage -p'gpg --no-tty --passphrase <passphrase>'

或者

dpkg-buildpackage -p'gpg --no-tty --passphrase-file <passphrase file>'

编辑:

警告严重的安全风险!
任何能够访问此类脚本的人都可以冒充您分发恶意软件。


这应该是被接受的答案,因为它准确地解决了所提出的问题。 - Ichthyo
然而,将私钥密码放入任何类型的文件中是有风险的,并且会削弱软件包分发的信任链。当攻击者获得对该脚本甚至仅仅是您的命令历史的访问权限时,他们可以注入恶意代码并将其分发给许多用户,而无需进一步交互,因为用户信任您的签名。 - Ichthyo

gpg-agent方法无法避免需要使用键盘输入密码。 我看到Freight使用了。
gpg --batch --passphrase-fd ...

将密码种子一次输入到gpg-agent中
除了已经在这里提到的其他方法之外,还可以使用密码短语来“种子化您的gpg-agent”;您可以将其构建到启动脚本中,并在构建机启动时需要手动干预一次。这样的设置稍微更安全,因为密码短语仅驻留在内存中。然而,能够读取内存内容的攻击者仍然可以窃取您的密码短语,然后以您的名义分发恶意软件。
  1. 首先停止现有的代理

    gpgconf --kill gpg-agent
    
  2. 然后启动一个新的实例,并允许注入密码;此外,我们可以增加这里的存活时间

    gpg-agent --default-cache-ttl 3600 --max-cache-ttl 86400 --allow-preset-passphrase --daemon
    
  3. 注入您的签名子密钥的密码 — 当运行此命令时,您将被提示输入密码。

    /usr/lib/gnupg/gpg-preset-passphrase --preset <keygrip>
    
为了使这个工作正常,你需要你的“签名子密钥”的“keygrip”(而不是主密钥!)。使用`gpg`来获取这些信息。
gpg --with-keygrip --list-secret-key <YourUserID>

签名子密钥位于主密钥和电子邮件地址之下,通常标记为ssb[S][SA]

提示

有时候你需要执行export GPG_TTY=$(tty)pinentry正常工作。
你可以从gpg-agent启动一个子Shell。
gpg-agent [..更多选项..] --daemon /bin/bash
这样,当子Shell退出时,代理也会退出,并且在子Shell中设置的任何密码都会被清除。

我在这方面经验不是很丰富,但我建议如下:
  1. 创建新的用户账户
  2. 为其创建一个未锁定的密钥
  3. 仅将该用户用于构建软件包,或者只是使用debsign进行签名,以确保该账户在构建过程和脚本中的安全性。
如果你真的信任机器的安全性,那么可以这样做。无论如何,你已经打算在命令中存储一个不安全的密码来解锁。

1这个方案的变种基本上就是Ubuntu-PPA-Builder所做的:你用你的密钥定期签署源代码包,并设置自动构建器以仅信任你的签名密钥来构建二进制包,然后使用另一个专用密钥对包进行签名,该密钥随后会发布给你的用户。然而,仍然非常危险,必须确保你的构建机器非常安全。 - Ichthyo