Openpgp:使用 python 包装器 python-gnupg 'error - sign-encrypt 17' - 仅在签名时出错

Openpgp: Using python wrapper python-gnupg 'error - sign-encrypt 17' - Error only when signing

为了加密和签署消息,我想使用 python-gnupgp 模块。该模块是 gnupgp 的包装器。 加密工作正常,但如果我指定签名选项,我会收到错误消息。

gpg: WARNING: unsafe permissions on homedir '/home//Programming/GnuPGP/pgphome'\ngpg: Warning: not using 'xxx' as default key: No secret key\ngpg: all values passed to '--default-key' ignored\n[GNUPG:] KEY_CONSIDERED xxx 0\n[GNUPG:] KEY_CONSIDERED AADFCABF9D6B54C7938195737DC2E276767872B0 0\ngpg: no default secret key: No secret key\n[GNUPG:] INV_SGNR 9\n[GNUPG:] FAILURE sign-encrypt 17\ngpg: [stdin]: sign+encrypt failed: No secret key\n"

但我已经导入了一个密钥,想使用 other_public.asc 加密并使用我自己的私钥签名。

我使用模块 python-openpgp。这是我的代码:

import gnupg
import os 


pgp_home = os.path.join(os.getcwd(), 'pgphome')
gpg = gnupg.GPG(gnupghome=pgp_home)

cwd = os.getcwd()

own_priv_key_path = os.path.join(cwd, 'assets/keys/own_secret.asc')
own_priv_key_data = open(own_priv_key_path).read()
own_priv_key = gpg.import_keys(own_priv_key_data, passphrase="hellomatthias1")

own_public_key_path = os.path.join(cwd, 'assets/keys/own_public.asc')
own_public_key_data = open(own_public_key_path).read()
own_public_key = gpg.import_keys(own_public_key_data)

other_public_key_path = os.path.join(cwd, 'assets/keys/other_pub.asc')
other_public_key_data = open(other_public_key_path).read()
other_public_key = gpg.import_keys(other_public_key_data)


gpg.trust_keys(own_public_key.fingerprints, trustlevel="TRUST_ULTIMATE")
gpg.trust_keys(own_priv_key.fingerprints, trustlevel="TRUST_ULTIMATE")
gpg.trust_keys(other_public_key.fingerprints, trustlevel="TRUST_ULTIMATE")

dummy_file_path = os.path.join(cwd, 'assets/dummyfiles/hello.txt')
output_file_path = os.path.join(cwd, 'assets/dummyfiles/encrypted_hello.txt')


res = gpg.encrypt("hello how are you", recipients=other_public_key.fingerprints[0], sign=own_priv_key.fingerprints[0], passphrase='passphraseofownprivatekey1')

我做错了什么?

我想问题不在于代码,而在于 python-gnupg 包装器直接使用 gpg 可执行文件,因此受 gpg 可执行文件要求的约束。

阅读错误消息,您可以看到 gpg 可执行文件拒绝您的密钥:

gpg: WARNING: unsafe permissions on homedir '/home//Programming/GnuPGP/pgphome'
gpg: Warning: not using 'xxx' as default key: No secret key
gpg: all values passed to '--default-key' ignored

Gpg 要求密钥必须存储在安全的主目录中,这意味着只有用户才能访问的主目录。看来您必须使用以下命令将 homedir /home//Programming/GnuPGP/pgphome 的权限减少给自己的用户:

$ chmod go-rwx /home//Programming/GnuPGP/pgphome

完成后,gpg 不应再忽略您的密钥。

可能需要排除写访问权限,我不这么认为,但在这种情况下,请使用:

$ chmod u-wx,go-rwx /home//Programming/GnuPGP/pgphome