在Windows 10上使用WSL2进行签名git提交时,Visual Studio Code没有GPG密码提示

26

当我从Windows 10在WSL2中提交代码时,我无法在Visual Studio Code中使用签名提交。

问题

Windows 10没有显示密钥密码提示,导致git出现错误:error: gpg failed to sign the data


设置

Windows设置

最新版本的Windows 10,带有WSL2和Windows Terminal。

Visual Studio Code已安装在Windows 10中,并且是最新版本(1.48.0),包括最新的Remote WSL Extension(v0.44.4)。

我的代码位于运行Ubuntu 20.04的WSL2中,所有软件包已更新。

使用code .命令从WSL2中打开Visual Studio Code。

Git设置

Git(2.25.1)已安装在WSL2中,并具有以下全局配置:

[user]
    name = My Name
    email = my.email@example.com
    signingkey = A1B2C3D4E5F67890
[commit]
    gpgsign = true

使用命令行在WSL2中初始化git仓库。

GPG设置

gnupg(2.2.19)已在WSL2中安装。

我有~/.gnupg/gpg.conf的设置。

use-agent
default-key A1B2C3D4E5F67890

并且 ~/.gnupg/gpg-agent.conf

default-cache-ttl 34560000
max-cache-ttl 34560000
pinentry-program /usr/bin/pinentry-curses

我的~/.zprofile

export GPG_TTY=$(tty)
export GPG_AGENT_INFO=${HOME}/.gnupg/S.gpg-agent:0:1

有效方法

如果我在Windows Terminal中的WSL2中运行git commit,它会提示我输入密码。

┌────────────────────────────────────────────────────────────────┐
│ Please enter the passphrase to unlock the OpenPGP secret key:  │
│ "My Name <my.email@example.com>"                               │
│ 4096-bit RSA key, ID A1B2C3D4E5F67890,                         │
│ created 2020-08-10.                                            │
│                                                                │
│                                                                │
│ Passphrase: __________________________________________________ │
│                                                                │
│         <OK>                                    <Cancel>       │
└────────────────────────────────────────────────────────────────┘

然后,这个密钥短语会在我登录Windows期间被缓存,直到我重新启动我的笔记本电脑。此后的任何提交都不再提示输入密码。

现在我可以使用Visual Studio Code git界面和VSCode内置终端来提交更改。


问题

如果我重新启动笔记本电脑,那么来自Visual Studio Code的提交将无法工作,直到我首先在WSL2中缓存GPG密码。

也许值得注意的是,如果我没有缓存密码并尝试从内置的VSCode终端进行提交,则提交也会失败。只有在通过Windows Terminal首先在WSL2中输入密码时才有效。

我知道Windows 10和WSL2实际上是两个不同的系统,但是否有办法让Windows在WSL2中运行的git显示GPG密码提示框?

还是我需要完全不同的设置?我长期以来一直在使用MacOS进行开发,因此不确定在Windows 10上最佳路线是什么。

编辑:2020-08-17我找到了https://github.com/diablodale/pinentry-wsl-ps1并使用该脚本作为pinentry。这有效,并在密码未被缓存时在Windows 10中显示GUI。但我想找到一种不依赖可能停止功能的脚本的解决方案。

6个回答

27

非常感谢@39digits提供的有用答案!

截至2021年8月的一些更新:

使用最新版本的gpg4win,您需要在WSL2 Ubuntu中的~/.gnupg/gpg-agent.conf文件中设置以下配置:

pinentry-program "/mnt/c/Program Files (x86)/Gpg4win/bin/pinentry.exe"

之后,您可能需要通过运行以下命令来重新启动GPG代理:

gpg-connect-agent reloadagent /bye

另外,您不再需要订阅 Windows Insiders 路线​​。


5
如果您已经安装了Git for Windows,则pinentry-program "/mnt/c/Program Files/Git/usr/bin/pinentry.exe"也可以正常工作。 - Allan Chain
这是一个很好的解决方案。只是顺便提一下,我不得不更新我的图形驱动程序才能让它工作。 - Laurence Rawlings

23

我找到了一个解决方案...但在写这篇文章时还有一些注意事项。

既然 Visual Studio Code 运行在 Windows 10 上面,而 git 和 gpg 则在 WSL2 中,我考虑试试在 Windows 10 上使用可视化的 pinentry。

直到我订阅了 Windows Insider 计划并升级到最新的 Dev Build(2004 Build 20190.1000)后,这个方法才奏效。

所需步骤:

加入 Windows Insider 计划并将 Windows 10 升级到 2004 Build 20190.1000(早期版本可能也能行,但我最先收到的是这个版本)。此操作将提供更高的互操作性,并且现在你会在 Windows Explorer 中看到 Linux 选项。

https://www.gpg4win.org安装 GPG4Win。只需要默认的 gnupg,但我还安装了 Kleopatra,以备其他用途。

编辑 ~/.gnupg/gpg-agent.conf 并更改 pinentry。

pinentry-program "/mnt/c/Program Files (x86)/GnuPG/bin/pinentry-basic.exe"

现在当你被要求输入密语时,GPG GUI会显示出来。

我已经测试过重启机器以确保密语没有被缓存,并且它适用于:

  • 从WSL2命令行提交
  • 使用Visual Studio Code git UI提交
  • 使用Visual Studio Code内置终端提交

这满足我的需求,但如果有任何我可能没有考虑到的部分,我很乐意听取建议。


我之前没有 ~/.gnupg/gpg-agent.conf 文件,但在我创建它后,这仍然有效。 - Sriram

4
在我的情况下:
  • 我使用配置了 X 服务器(X410)的 wsl2(ubuntu20.04 LTS),并通过安装 pinentry-gtk2 找到了解决方案。
  • 然后将 pinentry-program 配置为 /usr/bin/pinentry-gtk-2,一切工作正常。

步骤:

  1. 配置你的 X 服务器。
  2. 安装 pinentry-gtk2。执行命令 sudo apt install pinentry-gtk-2
  3. 配置 gpg-agent。将 pinentry-program /usr/bin/pinentry-gtk-2 添加到 ~/.gnupg/gpg-agent.conf
  4. 重新加载 gpg-agent。执行命令 gpg-connect-agent reloadagent /bye

注意事项: 可用的 pinentries

效果: enter image description here


可以确认这个方法有效。安装pinentry-qt会提供一个更好的图形界面,我需要在运行在WSL2内部的PHPStorm中进行GPG签名操作,同时也需要通过X410进行操作,所以我只是按照这里的官方Linux指南进行了安装,但是使用了pinentry-qt(或者pinentry-gtk2)而不是pinentry-gnome3。你可以在这里看到Qt版本的图形界面是什么样子的。 - Wrong

3
只是为了补充一下,现在看来一个简单的
git config --local gpg.program /usr/bin/gpg

在你的Git仓库中,这已经足够让VS Code能够正确地使用本地gpg安装进行签名提交。

0

您已指定pinentry-curses程序,这意味着当您想要提示输入密码时,需要有适当的TTY可用来提示您。

如果您不想要这种行为,还有其他的pinentry程序可供使用;例如Debian发行版提供了pinentry-gtk3软件包,可以提供图形提示。但是,这需要您的环境中有一个功能正常的X11服务器。这是必要的,因为Linux环境通常只支持通过X11(或可能是Wayland,在这里不太可能工作)进行图形支持。

还有其他可能性,比如您提到的可能能够提供本机Windows提示的软件,但所有这些都将依赖于附加的插件软件,因为Linux发行版和Windows都没有提供此功能的软件。Linux发行版通常不会为Windows图形界面提供软件,因为它们不提供Windows,所以大多数用户将无法使用它。

微软计划在未来为WSL提供更好的图形支持,但目前尚未实现。


我刚刚尝试使用安装在 Windows 系统上的 GPG 可视化 Pinentry,它运作正常。但在当前稳定版中它无法工作。为了使用即将推出的 WSL2 增强功能,我需要更新到 Insider Build 20190.1000 版本。 - 39digits

0
对于WLS2用户:
如果您的GIT版本大于等于v2.39.0
git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/bin/git-credential-manager.exe"

GIT >= v2.36.1
git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/libexec/git-core/git-credential-manager.exe"

GIT < v2.36.1
git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/bin/git-credential-manager-core.exe"

全面教程:

https://learn.microsoft.com/pt-br/windows/wsl/tutorials/wsl-git


PS: 你需要一个Git凭证管理器(GCM)吗? - IsraelCena

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接