python - 要求使用默认 key 进行 gpg 签名的密码的脚本

标签 python gnupg

我正在尝试使用 python-gnupgp 对文件进行 gpg 签名。

这应该很简单:

我的代码很简单:

import gnupg
import sys

gpg = gnupg.GPG()
stream = open(sys.argv[1], "rb")
signed_data = gpg.sign_file(stream)

print("signed data: %s" % (signed_data.data))
print("stderr: %s" % (signed_data.stderr))

现在上面的代码不起作用,因为我没有向 gpg.sign_file() 提供密码,并且 gnupg 不能要求它,如错误所示:

signed data: b''

stderr: [GNUPG:] USERID_HINT 1234567890ABCDEF me myself <me@example.com>

[GNUPG:] NEED_PASSPHRASE 1234567890ABCDEF 1234567890ABCDEF 1 0

gpg: Sorry, no terminal at all requested - can't get input

根据 this question/answer 的说法,问题可能是默认 GPG 选项中有 no-tty

现在我认为 no-tty 选项有意义,我想提供一种方法来请求密码,然后将其提供给 sign_file 调用.

在最简单的情况下,类似于:

import getpass
pw=getpass.getpass()
signed_data=gpg.sign_file(stream, passphrase=pw)

不,我的问题是,我想告诉用户,他们被要求输入哪个 key 的密码。 像

print("Please enter the passphrase for key %s" % defaultkey_id)
pw=getpass.getpass()

结果出乎意料地难以做到,因为我还没有找到查询默认 key ID 的方法。一个简单的 gpg.list_keys(True)[0] 给出一个随机私钥(当然不是随机的;很可能是第一个添加到 key 环中的私钥;但这不一定是默认 key )。

所以我想我真正的问题是:我怎样才能找出用于签名的默认 key ,这样我就可以要求用户提供这个 key 的密码?

(我不想解析$GNUPGHOME/gpg.conf的内容)

最佳答案

如果你有可用的 gpgconf,你可以解析 gpgconf gpg 的输出,它应该列出(在其他配置的选项中)配置的默认 key 。

关于python - 要求使用默认 key 进行 gpg 签名的密码的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30847395/

相关文章:

gnupg - gpg --export-secret-keys

python /POpen/gpg : Supply passphrase and encryption text both through stdin or file descriptor

python - 来自 Windows 客户端的无密码 Python LDAP3 身份验证

python - 是否可以将 "exe installers"与 pip 一起使用?

python - Boost.Python boost::shared_ptr 没有通过值转换器找到 python

python - 我使用 python mysql API 将数据插入 mysql 但当我没有添加语句 'with conn:' 时它不起作用

python - Python-初学者问题

gnupg - 如何使用Gnupg的passphrase-fd参数?

rvm - gpg : keyserver receive failed: No route to host stack overflow

encryption - 无法检查签名: public key not found