尝试在 WSL 上使用 gpg 在 git 上签署提交,但不起作用

问题描述 投票:0回答:4

我最近尝试了适用于 Linux 的 Windows 子系统,当我尝试使用最近生成的 GPG 密钥签署我的 git 提交时,它喷出了,

verticalfile30@DESKTOP-U284V9I:~/cpo/wsltest$ git commit -S -m "gpg signing"
error: gpg failed to sign the data
fatal: failed to write commit object

我使用 git 的时间足够长,知道我必须在 git 上设置本地或全局变量才能使用我的 GPG 密钥。

在第一个错误之后,我尝试生成另一个密钥,但这也不起作用,包括子密钥。

我的 GPG 采用 RSA 和 RSA(默认)加密。

我尝试使用help.github.com上的文章,但没有成功。

(以下是一些具体来源。) https://help.github.com/en/articles/telling-git-about-your-signing-key

https://help.github.com/en/articles/signing-commits

这是大部分终端日志

verticalfile30@DESKTOP-U284V9I:~/cpo/wsltest$ git config --global commit.gpgsign true
verticalfile30@DESKTOP-U284V9I:~/cpo/wsltest$ gpg2 --list-secret-keys --keyid-format LONG
gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   2  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: next trustdb check due at 2021-08-22
/home/verticalfile30/.gnupg/pubring.kbx
---------------------------------------
sec   rsa4096/498F47808959B459 2019-08-23 [SC] [expires: 2021-08-22]
      A533C851D2905FC63C161831498F47808959B459
uid                 [ultimate] Vert Simon (Key#3) <[email protected]>
ssb   rsa4096/E4E65BE559FFBE2C 2019-08-23 [E] [expires: 2021-08-22]

sec   rsa4096/B3C88EE54DC15CC9 2019-08-23 [SC]
      87F5399E6BFEF88C1C64794CB3C88EE54DC15CC9
uid                 [ultimate] Vert S (Sop) <[email protected]>
ssb   rsa4096/E868623210106F9D 2019-08-23 [E]

verticalfile30@DESKTOP-U284V9I:~/cpo/wsltest$ git config --global user.signingkey E868623210106F9D
verticalfile30@DESKTOP-U284V9I:~/cpo/wsltest$ git commit -S -m "gpg signing"
error: gpg failed to sign the data
fatal: failed to write commit object
verticalfile30@DESKTOP-U284V9I:~/cpo/wsltest$ git config --global user.signingkey B3C88EE54DC15CC9
verticalfile30@DESKTOP-U284V9I:~/cpo/wsltest$ git commit -S -m "gpg signing"
error: gpg failed to sign the data
fatal: failed to write commit object

许多在线资源,以及 Stack Overflow 上的其他问题,最终都说了同样的话,设置全局变量。 我是否忘记或弄错了什么?谢谢。

git github gnupg windows-subsystem-for-linux
4个回答
37
投票

随后出现在 microsoft/WSL 问题 4029

但在那种情况下,它是:

我的密钥有密码,但没有提示输入密码。

但是后来我读到了这个

第3步是

export GPG_TTY=$(tty)
,将提示符发送到tty。
输入我的密码后,一切正常。

示例:

danhorst/dotfiles
commit 805a779,后面是 gpg 未能签署数据 fatal: 未能写入提交对象 [Git 2.10.0].


您还可以参考 Christopher Hamilton 的“如何在 Windows 10 和 WSL2 上使用 Visual Studio Code 签署对 GitHub 的提交”。


16
投票
如果您使用 Kleopatra 来管理 Windows 中的 GPG 密钥,您可以将以下内容添加到 WSL 环境中的 ~/.gitconfig(相应地更新您的路径):

[gpg] program = /mnt/c/Program Files (x86)/GnuPG/bin/gpg.exe
添加此后,像往常一样出现输入我的 GPG 密钥密码的提示。

背景:在使用已安装的卷时,使用 Docker 对我来说非常慢。我决定仅在 Ubuntu WSL 环境目录(即 ~/projects/my_project)中部署存储库,并使用 Docker WSL2 支持从那里向上部署容器。我使用 Visual Studio Code,因此可以直接在 WSL 环境中打开编辑器并从那里开始工作。但是,我失去了签署承诺的能力。因此,上述解决方案允许我保留现有的工作流程。


9
投票
按照以下网址设置签名提交

https://help.github.com/en/articles/telling-git-about-your-signing-key

如果仍然得到 gpg failed to Sign the data fatal: failed to write commit object

这不是 git 的问题,这是 GPG 的问题,请按照以下步骤操作

  1. gpg --version

    
    

  2. echo "test" | gpg --clearsign

    
    

如果显示:

gpg: signing failed: Inappropriate ioctl for device gpg: [stdin]: clear-sign failed: Inappropriate ioctl for device

  1. 然后使用

    export GPG_TTY=$(tty)

    
    

  2. 然后重试

    echo "test" | gpg --clearsign

    其中PGP签名是。

输出:

-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 test -----BEGIN PGP SIGNATURE----- iLMEAQEKAB0WIQS2V0SFHi18psvDbo7uFF+LP7qc1gUCYLjB2QAKCRDuFF+LP7qc 1r5LBACB1m3Lpl21379qAvVamWcn9isdgdg34t34t43t34t34t434yGQHqikxWL7A5 Ls7giKZYscb30o0rkY6I1W9MjBBW96R2pnaYsioFpsf434dfg54rfdgfdgdfgdfpaIoU3k JKrYxR7yMjqUv0a2jE+97kh+bSuzqwIkMHyikbABI90lY+4OLw== =UHKx -----END PGP SIGNATURE-----

  1. git config -l | grep gpg
    
    
输出:

commit.gpgsign=true gpg.program=gpg tag.gpgsign=true

    申请
  1. git commit -S -m "initial commit 🚀🚀🚀🚀"
    
    
  2. git config --global commit.gpgsign true
    
    

gpg 无法对数据进行签名致命:无法写入提交对象 [Git 2.10.0]


0
投票
即使使用

export GPG_TTY=$(tty)

,我也无法让它在 WSL 上正常工作 - 尽管它在 Linux 主机上运行的 Linux 容器上运行良好。 pinentry 窗口可能会显示在不同的终端上,即使只有一个终端,也可能会显示乱码。

Tan 在

https://stackoverflow.com/a/66143018/487509 中给出的一种解决方案是使用 GPG4Win 中的 Windows gpg.exe。我有脚本来同步我的 GPG 密钥环,但不想调整它们,所以......这个解决方案侵入性较小:安装 GPG4Win,并使用它的 pinentry-basic.exe (来自 https://blog.codeminer42.com /secure-git-commits-on-windows-10-and-wsl2/)

~/.gnupg/gpg-agent.conf

 中输入此内容

pinentry-program "/mnt/c/Program Files (x86)/GnuPG/bin/pinentry-basic.exe"
    
© www.soinside.com 2019 - 2024. All rights reserved.