Нет запроса парольной фразы GPG в коде Visual Studio в Windows 10 для подписанных коммитов git с использованием WSL2

Я не могу использовать подписанные коммиты в Visual Studio Code при фиксации кода в WSL2 из Windows 10.

ПРОБЛЕМА

В Windows 10 не отображается запрос парольной фразы, что приводит к сбою git с error: gpg failed to sign the data


НАСТРОИТЬ

Установка Windows

Последняя версия Windows 10 с WSL2 и Windows Terminal.

Visual Studio Code is installed within Windows 10 and is the latest version (1.48.0) and includes the latest Remote WSL Extension (v0.44.4).

My code is within WSL2 running Ubuntu 20.04 with all packages updated.

Visual Studio Code is opened via the command line using the code . command from within WSL2.

Git Setup

Git (2.25.1) is installed within WSL2 with the following global config:

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

The git repository is initiated using the command line within WSL2.

GPG Setup

gnupg (2.2.19) is installed within WSL2.

I have ~/.gnupg/gpg.conf settings

use-agent
default-key A1B2C3D4E5F67890

And ~/.gnupg/gpg-agent.conf

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

And my ~/.zprofile

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

WHAT WORKS

If I run a git commit from within WSL2 in Windows Terminal it prompts me for my passphrase.

┌────────────────────────────────────────────────────────────────┐
│ 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>       │
└────────────────────────────────────────────────────────────────┘

This passphrase is then cached for the rest of my Windows session until I restart my laptop. Any commit after this no longer prompts for the passphrase.

I am now able to use the Visual Studio Code git UI and VSCode's built-in terminal to commit changes.


The Question

If I restart my laptop then commits from Visual Studio Code do not work until I first cache the GPG passphrase within WSL2.

Maybe worth noting, but if I haven't cached the passphrase and open the code within Visual Studio Code and try to do a commit from the built-in VSCode terminal it also fails. It only works if the passphrase is first entered within WSL2 via Windows Terminal.

I appreciate that Windows 10 and WSL2 are really two different systems but is there any way to get Windows to display a prompt for the GPG passphrase for git running in WSL2?

Or do I need to set things up completely differently? I've used MacOS for development for a long time now so not sure what the best route may be on Windows 10.

Изменить: 2020-08-17 Я нашел https://github.com/diablodale/pinentry-wsl-ps1 и использовал скрипт в качестве pinentry. Это работает и показывает графический интерфейс в Windows 10, когда кодовая фраза не кэшируется. Но я бы хотел найти решение, которое не зависит от сценария, который может перестать работать.

6 ответов

Решение

Я нашел решение... но на момент написания в нем есть оговорки.

Поскольку Visual Studio Code работает в Windows 10, а git и gpg находятся в WSL2, я подумал о том, чтобы попробовать визуальную pinentry на стороне Windows 10.

Это не сработало, пока я не подписался на трек Windows Insider и не обновился до последней версии Dev Build (2004 Build 20190.1000).

Необходимые шаги:

Присоединяйтесь к программе предварительной оценки Windows и обновите Windows 10 до версии 2004 Build 20190.1000 (может работать с более ранними сборками, но это та, которую я получил первым). Это будет сопровождаться некоторыми интересными дополнениями для WSL2 с улучшенной совместимостью - теперь вы также заметите опцию Linux в проводнике Windows.

Установите GPG4Win с https://www.gpg4win.org/. Ничего другого, кроме gnupg по умолчанию, не требуется, но я также установил Kleopatra на случай, если он пригодится в другом месте.

редактировать ~/.gnupg/gpg-agent.conf и поменять пинентри

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

Теперь, когда вас попросят ввести кодовую фразу, появится графический интерфейс GPG.

Я протестировал этот перезапуск машины, чтобы убедиться, что кодовая фраза не кэшируется и работает для:

  • Фиксация из командной строки WSL2
  • Фиксация с использованием Visual Studio Code git UI
  • Фиксация с помощью встроенного терминала Visual Studio Code

Это соответствует моим требованиям, но я рад услышать, есть ли какие-то моменты, которые я, возможно, не рассмотрел.

Большое спасибо @39digits за полезный ответ!

Некоторые обновления по состоянию на август 2021 года:

с последней версией gpg4win вам необходимо установить в себе следующую конфигурацию ~/.gnupg/gpg-agent.conf файл в WSL2 ubuntu:

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

Кроме того, вам больше не нужно подписываться на трек инсайдеров Windows.

В моем случае:

  • Я использую wsl2 ( ubuntu20.04 LTS) с X-сервером ( X410), и найдите решение, установив 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

Примечания: Доступны сосны

Эффект:

Просто чтобы добавить к этому немного, кажется, что теперь просто

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

достаточно (в вашем репозитории git), чтобы VS Code мог правильно подписывать коммиты с вашей локальной установкой gpg

Для пользователей 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

Вы указали pinentry-curses программа, что означает, что когда вы хотите, чтобы вас попросили ввести кодовую фразу, вам необходимо иметь соответствующий TTY, который будет запрашивать вас.

Если вы не хотите такого поведения, вы можете использовать другие программы pinentry; Debian, например, поставляетpinentry-gtk3пакет, который может предоставить графическую подсказку. Однако для этого требуется, чтобы в вашей среде был доступен работающий сервер X11. Это необходимо, потому что среды Linux обычно поддерживают только графику через X11 (или, возможно, Wayland, что здесь вряд ли будет работать).

Существуют и другие возможности, подобные тем, которые вы упомянули, которые могут предоставить собственное приглашение Windows, но все они будут полагаться на дополнительное дополнительное программное обеспечение, поскольку ни дистрибутивы Linux, ни Windows не поставляют программное обеспечение для обеспечения этой функции. Дистрибутивы Linux обычно не поставляют программное обеспечение для графических интерфейсов Windows, потому что они не поставляют Windows, поэтому большинство их пользователей не смогут его использовать.

Microsoft планирует предоставить лучшую графическую поддержку WSL в будущем, но пока этого не сделала.

Другие вопросы по тегам