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
为了加密和签署消息,我想使用 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