2012-09-21 54 views
0

我想部署一个项目,它使用GPG来加密发送到SOAP WebService的数据。当我试图加密文件时,我发现python-gnupg试图将一个锁定文件放入我的gnupghome目录中,该目录不能由运行Apache的用户写入。我宁愿不给“nobody”写入权限,那么有没有办法改变python-gnupg用来存储锁定文件的位置?更改python-gnupg锁定文件位置?

澄清: 有人向我指出,我可能没有明确表示,我目前设置gnupghome当我初始化对象,但我不想锁定文件放在那里,因为我不希望“无人”对该位置具有写入访问权限。

回答

3

锁定文件是由GnuPG的,而不是Python包装创建的,它总是在GNUPGHOME路径创建的,默认为~/.gnupghome

你不能阻止lockfile,但你可以将设置为临时目录。缺点是它不能加载默认的钥匙环,所以你需要明确地传递它,告诉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()),然后使用导入的密钥进行加密,然后清理整个临时住宅。

+0

+1不错的答案。 – rkyser

+0

是否有“选项”的版本要求?我一直被告知:'TypeError:__init __()有一个意外的关键字参数'options'' –

+0

我在0.3.1中看到'options'关键字参数被添加了:http://code.google.com/p/python- gnupg/issues/detail?id = 45和http://code.google.com/p/python-gnupg/ –

0

Python-GnuPG Getting Started表明,你可以设置gnupghome像这样:

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

是的,我设置了'gpupghome'到正确的目录,但我不要“无人”写入该目录。 –

+0

所以你想要把''gnupghome'设置为''''的文件存放在不同的目录下。 – rkyser

+0

正确。我会在这个问题上更加明确,我认为我已经得到了这一点,但我会更加明确。 –

0

如果您在使用以上,因此具有options参数python-gnupg版本0.3.1,您可以使用此解决方案,提供您所需要的钥匙扣是可读:

>>> g = gnupg.GPG(gnupghome='/path/to/gnupghome', options=['--lock-never']) 

我在使用此其中一个验证用户没有写权限gnupghome在所有的情景 - 只要读取权限上pubring.gpgtrustdb.gpg

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