
문맥
SSH 키 대신 GPG 인증 하위 키를 사용하고 싶습니다.
gpg-agent
또한 이 키에 대한 비밀번호 캐싱을 관리하는 데에도 사용하고 싶습니다 .
헤드리스 환경에서 실행중이라 비밀번호 입력 프로그램으로 사용하고 싶은데 pinentry-curses
헤드리스 환경에서 작동하는 것이라면 뭐든지 괜찮습니다.
내 개발 워크플로는 여러 세션과 창에서 작업하고 tmux
있으며 그 중 어느 창에서든 작업할 수 있어야 합니다 git push
.
문제
그렇게 하려고 하면 문제가 발생합니다. 현재 창에 팝업되는 대신 pinentry
임의의 다른 창에 팝업이 표시됩니다(때로는 창이 전혀 없을 수도 있지만 검색할 창이 너무 많을 수도 있음). 이 문제를 해결하려면 해당 창을 종료해야 하는데, pinentry-curses
그래도 여전히 실패하는 경우가 있습니다.
내가 시도한 것
내가 시도한 구성
내 현재 구성은 다음과 같습니다. 하지만 지난 몇 주 동안 이 작업을 수행하기 위해 수많은 노력을 기울였습니다.
# ~/.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
내가 시도한 링크
- X 없이 gpg2 pinentry가 실패함
- SSH, tmux 및 GnuPG 에이전트 모범 사례
- gpg-agent 및 SSH에서 Pinentry가 실패함
- 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가 최신 쉘을 가리킨다는 것입니다.
실제로 원하는 것은 최신 쉘 터미널이 아니라 연결하려는 터미널입니다(ssh 호출 시).
이를 위한 가장 쉬운 방법은 연결 중인 tty에서 업데이트 명령을 실행하도록 .ssh/config에 지시하는 것입니다. 이것은 당신이 놓친 마법의 라인입니다:
Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"