我正在尝试部署一个使用GPG加密发送到SOAP WebService的数据的项目。当我尝试加密文件时,我发现python-gnupg
试图将一个锁定文件放入我的gnupghome
目录中,而该用户无法在运行Apache的情况下写入该文件。我宁愿不给“nobody”写入权限,那么有没有办法改变python-gnupg用来存储锁文件的位置?
澄清:
有人向我指出,我可能没有说清楚我在初始化对象时正在设置gnupghome
,但我不希望将锁文件放在那里,因为我不想要“没人” “拥有对该位置的写入权限。
答案 0 :(得分:3)
锁定文件由gnupg创建,而不是python包装器,它始终在GNUPGHOME路径中创建,默认为~/.gnupghome
。
您无法阻止锁定文件,但可以将目录设置为临时目录。缺点是它无法加载默认密钥环,因此你需要明确地传递它,告诉GNUPG 忽略默认文件(如果你不这样做,它会痛苦地抱怨):
import tempfile
import shutil
home = tempfile.mkdtemp()
try:
gpg = gnupg.GPG(gnupghome=home, keyring='/path/to/keyring/file',
options=['--no-default-keyring'])
finally:
shutil.rmtree(home)
事实上,我已经为密钥环使用临时文件了。使用tempfile.mkstemp()
函数在上面生成的临时目录中创建一个空文件,将密钥(从数据库中提取)导入该密钥环(使用.import_keys()
),然后使用导入的密钥进行加密,在清理整个临时住所之前。
答案 1 :(得分:0)
Python-GnuPG Getting Started表示您可以设置gnupghome
,如下所示:
gpg = gnupg.GPG(gnupghome='/path/to/home/directory')
答案 2 :(得分:0)
如果您使用python-gnupg
版本0.3.1或更高版本并因此具有options
参数,则可以使用此解决方案,前提是您需要的密钥环可读:
>>> g = gnupg.GPG(gnupghome='/path/to/gnupghome', options=['--lock-never'])
我在验证用户根本没有gnupghome
的写入权限的情况下使用此功能 - 只需读取pubring.gpg
和trustdb.gpg
的权限:
>>> v = g.verify(open('message.gpg', 'r').read())
>>> v.valid
True