我有两个 PGP 密钥,用于在 kmail 中签名和解密电子邮件。这样做时,我必须输入密钥的密码(当前存储在 KeePass 中)。
是否可以将密码保存在我的 kwallet 中,以便根据需要自动解锁密钥?如果是这样,如何实现这一目标?
编辑:我发现了类似的东西这里,但适用于 SSH 密钥而不是 PGP 密钥。也许这可以调整?
答案1
解锁
是否可以将密码保存在我的 kwallet 中,以便根据需要自动解锁密钥?如果是这样,如何实现这一目标?
据我所知,这不能在 kWallet 中完成。使用gpg-agent
反而。您可以根据需要自由设置其设置,在安全性和易于访问之间取得平衡。根据您运行的发行版,代理应该可以开箱即用。也许它甚至已经在后台运行了?
其他密钥管理
我从来没有用过凯通,所以我不知道它的特点。然而,GPG可能值得一看。它是系统 GnuPG 的 GUI 前端。具体来说,它还允许低水平GPG的设置,包括GPG代理。
GnuPG 设置
您可以在此处配置
configuration file
使用哪个 gpg 二进制文件以及哪个主文件夹。这些值是在第一次启动时自动检测的,并且应该已经可以工作。使用GnuPG 代理使使用 GnuPG 更加舒适,因为您无需为每个操作输入密码。它会在内存中缓存一段时间,因此任何需要密码的操作都可以立即完成。请注意,如果您让其他人可以访问您的会话,这可能会允许其他人使用您的私钥。
邮件
该问题还包含 kmail 标签,因此我也会对此进行详细说明。您可能想阅读PGP配置部分和kmail 常见问题解答,GnuPG 部分。如果您已经使用上面的 kGPG 设置了密钥,则不必非常担心所有肥胖警告和页面顶部的步骤。只需了解它们即可。
一体化
整合实际上是隐式发生的。 kGPG 只是告诉 GnuPG 哪些键要创建、修改、打开和更多操作。它在其界面中列出了系统上的密钥及其信任级别等。但在后台,所有内容都~/.gnupg
以 GnuPG 格式存储在目录中。 (我不确定kGPG是调用GPG还是链接到GPG库,但效果是一样的)
kMail 只是另一种前端。它调用gpg
命令来访问存储在同一目录中的密钥。例如用于签名、加密和解密。
这gpg-agent
是会话范围内的。这意味着,如果您在 kGPG 中解锁私钥,kMail 的私钥也将被解锁,反之亦然。
编辑
我刚刚发现夸勒特克利,它为 pinentry 提供 kwallet 绑定。我的发行版不提供软件包,因此目前我无法尝试。
如果您的发行版也不支持该软件包,您可能需要手动安装该软件包。
再次,拱门维基出现并拯救了这一天:
提示:要使用 /usr/bin/pinentry-kwallet,您必须安装 kwalletcli 软件包。
~/.gnupg/gpg-agent.conf:
#pinentry interface with kdewallet
pinentry-program /usr/bin/pinentry-kwallet
选择
如果您不想或无法安装夸勒特克利,您也许可以使用该kwallet-query
命令执行一些脚本编写。您必须了解打开哪个钱包才能获取密码。请参阅man kwallet-query
获取更多信息。
但是,gpg 默认情况下不允许从 STDIN 输入密码,因此您需要配置gpg为了它。
关于 ssh-agent 的注意事项
如果你让 gpg-agent 正常工作,你也可以将它用作ssh代理。
Kubuntu 22.04 (Jellyfish) 上的示例如何在 Git 中使用 Keybase PGP 密钥(身份验证和签名)
# setup Keybase where you're storing PGP keys in cloud
https://keybase.io/docs/the_app/install_linux
# Import the public key
keybase pgp export | gpg --import
# Import the private key
keybase pgp export -s | gpg --allow-secret-key-import --import
# show all keys
gpg --list-keys --with-keygrip
gpg --list-secret-keys --with-keygrip
# There should be 3 keys: one main [SC]==PUBKEY_USAGE_SIG&PUBKEY_USAGE_CERT and two subkeys [A]==PUBKEY_USAGE_AUTH && [E]==PUBKEY_USAGE_ENC
# Now you have to edit main one ([SC] ID) of them to "trust" it
gpg --edit-key PUT_[SC]_ID_HERE
key 0
trust
5
y
key 1
trust
5
y
key 2
trust
5
y
quit
echo 'enable-ssh-support' >> ~/.gnupg/gpg-agent.conf
echo 'pinentry-program /usr/bin/pinentry-kwallet' >> ~/.gnupg/gpg-agent.conf
gpg -K --with-keygrip
echo 'PUT_[A]_keygrip_ID_HERE' >> ~/.gnupg/sshcontrol
echo 'export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)' >> ~/.bashrc
echo 'gpgconf --launch gpg-agent' >> ~/.bashrc
# setup git configs & set your favorite editor
echo 'export VISUAL="vim"' >> ~/.bashrc
git config --global commit.gpgsign true
gpg --list-secret-keys --keyid-format=long
git config --global user.signingkey [SC]_sec_id
git config --global user.name "stackexchange"
git config --global user.email [email protected]
# reload terminal env & gpg-agent and check everything works
source ~/.bashrc
gpgconf --kill gpg-agent
ssh-add -L
ssh -T [email protected]
答案2
基于夸勒特克利在 @Tim 的回答中建议,我编写了一个小 python 脚本来查找 kwallet 中的密码,可以在 github 上找到。它唯一的依赖是钥匙圈蟒蛇模块。
只是告诉gpg-代理使用它来代替您当前的皮恩特里,它就会发挥魔力。它还将在后台运行真正的 pinentry 进程,以处理不需要密码的所有内容。