如果我得到[GNUPG:] PINENTRY_LAUNCHED 16376 curses 1.2.1 - -:0.0 - 1000/1000 0 0,如何在ArchLinux上配置GPG并在GitHub上签名?

enyaitl3  于 2023-08-01  发布在  Git
关注(0)|答案(1)|浏览(80)

我已经基于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


我需要签署我所有的未来承诺。

6ojccjat

6ojccjat1#

如果有GUI可用,请先尝试使用pinentry-gnome 3,并调整~/.gnupg/gpg-agent.conf

sudo pacman -S pinentry-gnome3

字符串
This thread提到:
深入挖掘,看起来潜在的问题与通过标准输入传递OpenPGP输入时使用pinentry-tty(我的情况)或pinentry-curses有关。这会导致pinentry在提示之前给予。
对于pinentry-tty,它失败为“ERR 83886340 Invalid IPC response”,pinentty-curses失败为“ERR 83918950 Inappropriate ioctl for device”。
换句话说,此命令仅在使用GUI样式的细条目时有效:

$ gpg --decrypt <message.gpg


但这两种方法都适用,因为它不会绑定标准输入:

$ gpg --decrypt message.gpg


我希望pinentry-tty/-curses能在第一种情况下工作,因为它会直接使用/dev/tty,而不是依赖于tty的标准输入/输出。
如果无法使用GUI,则需要一种不使用stdin的不同方法。
当Git发出GPG签名请求时,它不会通过文件将数据传递给GPG,而是使用标准输入(stdin)来完成。这在很大程度上是因为它更高效和安全-将潜在的敏感数据写入磁盘,即使是临时性的也是有风险的。
但是,您可以通过使用一个 Package 脚本来处理Git用于签名的gpg命令。该脚本将确保将数据写入临时文件,然后传递给gpg,这样它就不会使用stdin。
为了测试,在PATH中创建一个文件(比如/usr/local/bin/),例如名为gpgwrap。确保将此目录添加到PATH环境变量中。

#!/bin/bash
# gpgwrap

# Generate a temporary file
TEMPFILE=$(mktemp)

# Save the input to the temporary file
cat > "$TEMPFILE"

# Call gpg with the temporary file as an argument
/usr/bin/gpg "$@" "$TEMPFILE"

# Clean up
rm "$TEMPFILE"


它从stdin读取数据,将其保存到一个临时文件中,然后以文件名作为参数调用gpg
运行chmod +x /usr/local/bin/gpgwrap使脚本可执行。
然后更新Git配置,使用gpgwrap脚本进行签名:

git config --global gpg.program gpgwrap


该脚本应该适用于大多数情况,但请注意,它不是一个通用的解决方案-它没有考虑到gpg可能以现有文件作为参数调用的情况:使用它来测试你的问题是否链接到标准输入。

相关问题