문맥
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가 터미널이 열릴 때마다 호출되므로 pinentry가 최신 쉘을 가리킨다는 것입니다.
정말로 원하는 것은 최신 쉘 터미널이 아니라 연결하려는 터미널(ssh를 호출할 때)입니다.
이를 수행하는 가장 쉬운 방법은 연결 중인 tty에서 업데이트 명령을 실행하도록 .ssh/config에 지시하는 것입니다. 이것은 당신이 놓친 마법의 실입니다:
Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"