【发布时间】:2015-06-15 14:11:42
【问题描述】:
我正在尝试使用 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 无法要求它,如错误所示:
签名数据:b''
stderr: [GNUPG:] USERID_HINT 1234567890ABCDEF 我自己
[GNUPG:] NEED_PASSPHRASE 1234567890ABCDEF 1234567890ABCDEF 1 0
gpg:抱歉,根本没有请求终端 - 无法获取输入
根据this question/answer,问题很可能是默认GPG选项中有no-tty。
现在我认为no-tty 选项很有意义,我想提供一种方法来询问密码,然后将其提供给sign_file 调用。
在最简单的情况下,类似于:
import getpass
pw=getpass.getpass()
signed_data=gpg.sign_file(stream, passphrase=pw)
不,我的问题是,我想告诉用户,他们被要求输入哪个密钥的密码。 像
print("Please enter the passphrase for key %s" % defaultkey_id)
pw=getpass.getpass()
结果出人意料地难以做到,因为我还没有找到查询默认键 ID 的方法。一个简单的gpg.list_keys(True)[0] 会给出一个随机的私钥(当然不是随机的;很可能是第一个添加到密钥环的;但这不一定是默认密钥)。
所以我想我真正的问题是:我怎样才能找出用于签名的默认密钥是什么,所以我可以要求用户输入这个密钥的密码?
(我宁愿不解析$GNUPGHOME/gpg.conf的内容)
【问题讨论】: