我已经基于GitHub文档创建了GPG密钥,这意味着我做了:
gpg --full-generate-key
gpg --list-secret-keys --keyid-format=long
$ gpg --list-secret-keys --keyid-format=long
/Users/hubot/.gnupg/secring.gpg
------------------------------------
sec 4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]
uid Hubot <hubot@example.com>
ssb 4096R/4BB6D45482678BE3 2016-03-10
gpg --armor --export 3AA5C34371567BD2
字符串
在那之后,我尝试将它添加到我的.gitconfig中,例如
[commit]
gpgsign = true
[gpg]
program = /usr/bin/gpg2
型
我设置gpg2是因为当我运行gpg --version
时,我得到:
[b@the-b-arch ~]$ gpg --version
gpg (GnuPG) 2.2.41
libgcrypt 1.10.2-unknown
Copyright (C) 2022 g10 Code GmbH
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Home: /home/b/.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2
型
我也添加到我的.bashzrc线
GPG_TTY=$(tty)
export GPG_TTY
型
然而,当我尝试签署一个提交时,我仍然得到它:
> git -c user.useConfigOnly=true commit --quiet --allow-empty-message --file -
error: gpg failed to sign the data:
[GNUPG:] KEY_CONSIDERED 3B9CAC1EE7A5F97A1B10123D6F4F7B6D29518083 2
[GNUPG:] BEGIN_SIGNING H8
[GNUPG:] PINENTRY_LAUNCHED 12345 custompinentry 1.0.0 - - :0.0 - 1000/1000 0
gpg: signing failed: Inappropriate ioctl for device
[GNUPG:] FAILURE sign 11223344
gpg: signing failed: Inappropriate ioctl for device
fatal: failed to write commit object
型
我需要签署我所有的未来承诺。
1条答案
按热度按时间6ojccjat1#
如果有GUI可用,请先尝试使用pinentry-gnome 3,并调整
~/.gnupg/gpg-agent.conf
字符串
This thread提到:
深入挖掘,看起来潜在的问题与通过标准输入传递OpenPGP输入时使用
pinentry-tty
(我的情况)或pinentry-curses
有关。这会导致pinentry在提示之前给予。对于
pinentry-tty
,它失败为“ERR 83886340 Invalid IPC response
”,pinentty-curses
失败为“ERR 83918950 Inappropriate ioctl for device
”。换句话说,此命令仅在使用GUI样式的细条目时有效:
型
但这两种方法都适用,因为它不会绑定标准输入:
型
我希望
pinentry-tty/-curses
能在第一种情况下工作,因为它会直接使用/dev/tty
,而不是依赖于tty的标准输入/输出。如果无法使用GUI,则需要一种不使用stdin的不同方法。
当Git发出GPG签名请求时,它不会通过文件将数据传递给GPG,而是使用标准输入(stdin)来完成。这在很大程度上是因为它更高效和安全-将潜在的敏感数据写入磁盘,即使是临时性的也是有风险的。
但是,您可以通过使用一个 Package 脚本来处理Git用于签名的
gpg
命令。该脚本将确保将数据写入临时文件,然后传递给gpg
,这样它就不会使用stdin。为了测试,在
PATH
中创建一个文件(比如/usr/local/bin/
),例如名为gpgwrap
。确保将此目录添加到PATH
环境变量中。型
它从stdin读取数据,将其保存到一个临时文件中,然后以文件名作为参数调用
gpg
。运行
chmod +x /usr/local/bin/gpgwrap
使脚本可执行。然后更新Git配置,使用
gpgwrap
脚本进行签名:型
该脚本应该适用于大多数情况,但请注意,它不是一个通用的解决方案-它没有考虑到
gpg
可能以现有文件作为参数调用的情况:使用它来测试你的问题是否链接到标准输入。