2012-09-21 92 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