更改python gnupg锁文件位置?

更改python gnupg锁文件位置?,python,gnupg,Python,Gnupg,我正在尝试部署一个项目,该项目使用GPG加密发送到SOAP Web服务的数据。当我试图加密该文件时,我发现python-gnupg试图将一个锁文件放入我的gnupghome目录中,Apache运行时用户无法写入该目录。我宁愿不给“nobody”授予写访问权,那么有没有办法改变pythongnupg用来存储锁文件的位置呢 澄清: 有人向我指出,在初始化对象时,我可能没有明确说明我当前正在设置gnupghome,但我不希望将锁文件放在那里,因为我不希望“任何人”对该位置具有写访问权限。显示您可以这样

我正在尝试部署一个项目,该项目使用GPG加密发送到SOAP Web服务的数据。当我试图加密该文件时,我发现
python-gnupg
试图将一个锁文件放入我的
gnupghome
目录中,Apache运行时用户无法写入该目录。我宁愿不给“nobody”授予写访问权,那么有没有办法改变pythongnupg用来存储锁文件的位置呢

澄清: 有人向我指出,在初始化对象时,我可能没有明确说明我当前正在设置
gnupghome
,但我不希望将锁文件放在那里,因为我不希望“任何人”对该位置具有写访问权限。

显示您可以这样设置
gnupghome

gpg = gnupg.GPG(gnupghome='/path/to/home/directory')
显示您可以这样设置
gnupghome

gpg = gnupg.GPG(gnupghome='/path/to/home/directory')

锁文件是由gnupg而不是python包装器创建的,它总是在GNUPGHOME路径中创建的,默认为
~/.GNUPGHOME

不能阻止锁定文件,但可以将目录设置为临时目录。缺点是它无法加载默认密钥环,因此您需要显式地传递它,告诉GNUPG忽略默认文件(如果不这样做,它会痛苦地抱怨):


事实上,我甚至还为钥匙圈使用了一个临时文件;使用
tempfile.mkstemp()
函数在上面生成的临时目录中创建一个空文件,将密钥(从数据库中提取)导入该密钥环(使用
.import_keys()
),然后使用导入的密钥进行加密,然后再清理整个临时主目录。

锁文件由gnupg创建,不是python包装器,它总是在GNUPGHOME路径中创建,默认为
~/.GNUPGHOME

不能阻止锁定文件,但可以将目录设置为临时目录。缺点是它无法加载默认密钥环,因此您需要显式地传递它,告诉GNUPG忽略默认文件(如果不这样做,它会痛苦地抱怨):


事实上,我甚至还为钥匙圈使用了一个临时文件;使用
tempfile.mkstemp()
函数在上面生成的临时目录中创建一个空文件,将密钥(从数据库中提取)导入该密钥环(使用
.import\u keys()
),然后使用导入的密钥进行加密,在清理整个临时住宅之前。

如果您使用的是
python gnupg
版本0.3.1或更高版本,因此具有
选项
参数,则可以使用此解决方案,前提是您需要的钥匙圈可读:

>>> g = gnupg.GPG(gnupghome='/path/to/gnupghome', options=['--lock-never'])
我在一个场景中使用它,验证用户根本没有对
gnupghome
的写入权限——只需读取
publing.gpg
trustdb.gpg
的权限即可:

>>> v = g.verify(open('message.gpg', 'r').read())
>>> v.valid
True

如果您使用的是
python gnupg
version 0.3.1或更高版本,因此具有
options
参数,则可以使用此解决方案,前提是所需的钥匙圈可读:

>>> g = gnupg.GPG(gnupghome='/path/to/gnupghome', options=['--lock-never'])
我在一个场景中使用它,验证用户根本没有对
gnupghome
的写入权限——只需读取
publing.gpg
trustdb.gpg
的权限即可:

>>> v = g.verify(open('message.gpg', 'r').read())
>>> v.valid
True

是的,我将
gpupghome
设置为正确的目录,但我不希望“无人”写入该目录。因此,您希望锁文件存储在与
gnupghome
设置为不同的目录中?正确。我将在问题中更清楚地说明这一点,我认为我已经理解了,但我将更明确。是的,我将
gpupghome
设置为正确的目录,但我不希望“无人”写入该目录。因此,您希望锁文件存储在与
gnupghome
设置为不同的目录中?正确。我会在问题中更清楚地说明这一点,我想我已经明白了,但我会更明确地说。
选项
是否有版本要求?我一直被告知:
TypeError:\uuuuu init\uuuuuuuuuuo()得到了一个意外的关键字参数“options”
我看到
options
关键字参数是在0.3.1中添加的:好的,手动升级到该参数,因为
easy\u install
似乎没有找到它。但是,您不需要这些选项,指定
键环将自动添加它。谢谢你的帮助!我不清楚为什么需要在
mkdtemp()
'd目录中使用
mkstemp()
作为临时密钥环。我是不是遗漏了什么?@zigg:我的钥匙圈是用来保存数据库中存储的钥匙的。因此,当我加密时,我需要创建一个临时密钥环来保存该密钥。根本不需要永久存储该钥匙圈。
选项
是否有版本要求?我一直被告知:
TypeError:\uuuuu init\uuuuuuuuuuo()得到了一个意外的关键字参数“options”
我看到
options
关键字参数是在0.3.1中添加的:好的,手动升级到该参数,因为
easy\u install
似乎没有找到它。但是,您不需要这些选项,指定
键环将自动添加它。谢谢你的帮助!我不清楚为什么需要在
mkdtemp()
'd目录中使用
mkstemp()
作为临时密钥环。我是不是遗漏了什么?@zigg:我的钥匙圈是用来保存数据库中存储的钥匙的。因此,当我加密时,我需要创建一个临时密钥环来保存该密钥。根本不需要永久存储该钥匙圈。