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

#git #visual-studio-code #gnupg #wsl-2

#git #visual-studio-code #gnupg #wsl-2

Вопрос:

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

ПРОБЛЕМА

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


НАСТРОЙКА

Настройка Windows

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

Visual Studio Code установлен в Windows 10 и является последней версией (1.48.0) и включает в себя последнее удаленное расширение WSL (версия 0.44).

Мой код находится в WSL2 под управлением Ubuntu 20.04 со всеми обновленными пакетами.

Код Visual Studio открывается через командную строку с помощью code . команды из WSL2.

Настройка 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
  

ЧТО РАБОТАЕТ

Если я запускаю git commit из WSL2 в терминале Windows, мне запрашивается моя кодовая фраза.

 ┌────────────────────────────────────────────────────────────────┐
│ 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, пока я не перезапущу свой ноутбук. Любой коммит после этого больше не запрашивает ключевую фразу.

Теперь я могу использовать пользовательский интерфейс git Visual Studio Code и встроенный терминал VSCode для фиксации изменений.


Вопрос

Если я перезапущу свой ноутбук, коммиты из Visual Studio Code не будут работать, пока я сначала не кэширую кодовую фразу GPG в WSL2.

Возможно, стоит отметить, но если я не кэшировал кодовую фразу и открываю код в Visual Studio Code и пытаюсь выполнить фиксацию из встроенного терминала VSCode, это также завершается неудачей. Это работает, только если кодовая фраза впервые введена в WSL2 через терминал Windows.

Я понимаю, что Windows 10 и WSL2 на самом деле две разные системы, но есть ли какой-либо способ заставить Windows отображать запрос на кодовую фразу GPG для git, работающего в WSL2?

Или мне нужно настроить все совершенно по-другому? Я уже давно использую macOS для разработки, поэтому не уверен, какой наилучший маршрут может быть в Windows 10.

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

Ответ №1:

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

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

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

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

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

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

Отредактируйте ~/.gnupg/gpg-agent.conf и измените pinentry

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

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

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

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

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

Комментарии:

1. У меня еще не было ~/.gnupg/gpg-agent.conf файла, но это все еще работало после того, как я его создал.

Ответ №2:

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

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

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

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

После этого может потребоваться перезапустить агент GPG, выполнив:

 gpg-connect-agent reloadagent /bye
  

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

Комментарии:

1. Теперь, если установлен Git для Windows, pinentry-program "/mnt/c/Program Files/Git/usr/bin/pinentry.exe" также работает.

2. Это отличное решение. Просто замечу, что мне пришлось обновить свои графические драйверы, чтобы заставить его работать.

Ответ №3:

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

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

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

Ответ №4:

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

  • Я использую 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-agent. Добавить pinentry-program /usr/bin/pinentry-gtk-2 в ~/.gnupg/gpg-agent.conf
  4. Перезагрузите gpg-агент. Выполнить команду gpg-connect-agent reloadagent /bye

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

Эффект: введите описание изображения здесь

Ответ №5:

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

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

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

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

Комментарии:

1. Я только что попробовал использовать GPG visual pinentry, установленный на стороне Windows, и это сработало. Это не сработало на текущей стабильной версии. Мне нужно было обновиться до сборки Insider 20190.1000 для предстоящих улучшений WSL2.