Visual Studio 代码中没有 GPG 密码提示 Windows 10 使用 WSL2 签名的 git 提交

No GPG passphrase prompt in Visual Studio Code on Windows 10 for signed git commits using WSL2

当从 Windows 10.

在 WSL2 中提交代码时,我无法在 Visual Studio 代码中使用签名提交

问题

Windows10 内未显示密码提示,导致 git 失败 error: gpg failed to sign the data


设置

Windows 设置

带有 WSL2 和 Windows 终端的 Windows10 的最新版本。

Visual Studio 代码安装在 Windows 10 中,是最新版本 (1.48.0),包括最新的远程 WSL 扩展 (v0.44.4)。

我的代码在 WSL2 运行ning Ubuntu 20.04 中,所有包都已更新。

Visual Studio 使用 WSL2 中的 code . 命令通过命令行打开代码。

Git 设置

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

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

git 存储库是使用 WSL2 中的命令行启动的。

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 终端中从 WSL2 中 运行 a 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 代码 git UI 和 VSCode 的内置终端来提交更改。


问题

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

可能值得注意,但如果我没有缓存密码并在 Visual Studio 代码中打开代码并尝试从内置 VSCode 终端进行提交,它也会失败。仅当密码首先通过 Windows 终端在 WSL2 中输入时才有效。

我很欣赏 Windows 10 和 WSL2 实际上是两个不同的系统,但是有什么方法可以让 Windows 显示 git [=127 的 GPG 密码提示=]宁在WSL2?

或者我需要进行完全不同的设置吗?我已经使用 MacOS 进行开发很长时间了,所以不确定 Windows 10.

上的最佳路线是什么

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

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

如果您不希望出现这种情况,可以使用其他输入法程序;例如,Debian 提供了 pinentry-gtk3 软件包,它可以提供图形提示。但是,这需要您的环境中有可用的功能 X11 服务器。这是必要的,因为 Linux 环境通常只支持通过 X11 的图形(或者可能是 Wayland,它在这里不太可能工作)。

还有像您提到的其他可能能够提供本机 Windows 提示的可能性,但所有这些都将依赖于额外的 add-on 软件,因为 Linux 发行版也没有 Windows 发布软件来提供此功能。 Linux 发行版通常不提供 Windows 图形界面的软件,因为它们不提供 Windows,所以他们的大多数用户将无法使用它。

微软计划在未来为 WSL 提供更好的图形支持,但目前还没有这样做。

我找到了解决方案...但在撰写本文时有一些注意事项。

由于 Visual Studio 代码在 Windows 10 中是 运行 并且 git & gpg 在 WSL2 中,我想尝试在 Windows 上进行视觉输入10面。

直到我订阅了 Windows Insider's track 并更新到最新的 Dev Build (2004 Build 20190.1000),这才起作用。

所需步骤:

加入 Windows Insider 计划并将 Windows 10 更新为 2004 Build 20190.1000(可能适用于早期版本,但这是我最先收到的版本)。这将为 WSL2 带来一些有趣的额外功能,提高互操作性 - 您现在还会注意到 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 提交 command-line
  • 使用 Visual Studio 代码 git UI
  • 提交
  • 使用 Visual Studio 代码 built-in 终端
  • 提交

这符合我的要求,但很高兴听到是否有任何我可能没有考虑到的地方。

就我而言:

  • 我使用 wsl2 (ubuntu20.04 LTS) 配置了 X server (X410),并通过安装 pinentry-gtk2 找到解决方案。
  • 然后将pinentry-program配置为/usr/bin/pinentry-gtk-2,一切正常。

步骤:

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

备注: Avaliable pinentries

效果:

非常感谢@39digits 的有用回答!

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

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

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

之后,您可能需要通过运行重启GPG代理:

gpg-connect-agent reloadagent /bye

此外,您不再需要订阅 windows 内幕消息。

只是补充一点,现在看起来很简单

git config --local gpg.program /usr/bin/gpg

足以(在您的 git 存储库中)让 VS Code 能够正确地使用本地 gpg 安装签署提交