
Контекст
Я хотел бы использовать подключи аутентификации GPG вместо ключей SSH.
Я также хотел бы использовать gpg-agent
кэширование паролей для этих ключей.
Я работаю в среде headless, поэтому хотел бы использовать pinentry-curses
для своей программы ввода паролей, но меня устроит все, что работает в среде headless.
Мой рабочий процесс разработки таков, что я работаю в нескольких tmux
сеансах и панелях и мне нужно иметь возможность работать git push
из любого из них.
Проблема
Проблема возникает, когда я пытаюсь это сделать. Вместо того, чтобы pinentry
появиться в моей текущей панели, он появляется в случайной другой панели (или иногда, возможно, вообще не в какой-либо панели, но возможно, их просто слишком много, чтобы искать). Чтобы решить эту проблему, мне нужно убить эту панель, и pinentry-curses
даже тогда он все еще иногда терпит неудачу.
Что я пробовал
Конфигурации, которые я пробовал
My current configuration is as follows, though I've tried a plethora over the past couple weeks to attempt to get this working.
# ~/.zshrc
unset SSH_AGENT_PID
if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then
export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"
fi
if [[ $SSH_AUTH_SOCK == /tmp/* ]]; then
ln -sf $SSH_AUTH_SOCK $HOME/.ssh-agent-sock
export SSH_AUTH_SOCK=$HOME/.ssh-agent-sock
fi
export GPG_TTY=$(tty)
gpg-connect-agent updatestartuptty /bye >/dev/null
# ~/.gnupg/gpg-agent.conf
pinentry-program /usr/sbin/pinentry-curses
default-cache-ttl 600
max-cache-ttl 7200
enable-ssh-support
# ~/.gnupg/gpg.conf
use-agent
# ~/.gnupg/sshcontrol
MYFINGERPRINTS
# ~/.ssh/config
Host localhost
ForwardAgent yes
AddKeysToAgent ask
Ссылки, которые я пробовал
- gpg2 pinentry не работает без X
- Лучшие практики для SSH, tmux и GnuPG Agent
- Не удается ввести пароль с помощью gpg-agent и SSH
- https://wiki.archlinux.org/index.php/GnuPG#SSH_agent
- https://gist.github.com/andrewlkho/7373190
- https://www.linode.com/docs/security/authentication/gpg-key-for-ssh-authentication/
- https://opensource.com/article/19/4/gpg-subkeys-ssh
Обновление: рабочая конфигурация (еще раз спасибо @SystematicFrank)
# ~/.zshrc
export GPG_TTY=$(tty)
# ~/.gnupg/gpg-agent.conf
pinentry-program /usr/bin/pinentry-curses
default-cache-ttl 600
max-cache-ttl 7200
enable-ssh-support
# ~/.gnupg/gpg.conf
use-agent
# ~/.gnupg/sshcontrol
MYFINGERPRINTS
# ~/.ssh/config
Host localhost
ForwardAgent yes
AddKeysToAgent ask
Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"
решение1
Проблема в том, что вы вызываете gpg-connect-agent updatestartuptty
каждый раз, когда открываете терминал, поэтому pinentry указывает на последнюю версию оболочки.
На самом деле вам нужна не последняя версия терминала shell, а та, с которой вы подключаетесь (при вызове ssh)
Для этого самый простой способ — сказать .ssh/config выполнить команду обновления с tty, к которому вы подключаетесь. Это магическая строка, которую вам не хватает:
Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"