로컬 워크스테이션에서는 커밋 서명이 승인되었지만 SSH를 통한 동일한 워크스테이션에서는 실패합니까?

로컬 워크스테이션에서는 커밋 서명이 승인되었지만 SSH를 통한 동일한 워크스테이션에서는 실패합니까?

저는 Ubuntu 18.04.3 LTS x86_64 시스템(완전히 패치됨)에서 작업하고 있습니다. 머신에는 GNOME3 데스크탑이 있습니다. 때로는 워크스테이션에 앉아 있고 때로는 워크스테이션에 SSH로 접속합니다.

워크스테이션에 앉아 있으면 Git 커밋 서명이 작동합니다. 을 사용하고 git commit -S ... -m ...있는데 예상대로 작동합니다. 평소와 같이 GnuPG 비밀번호와 작업 흐름에 대한 UI 프롬프트가 표시됩니다.

SSH를 통해 동일한 워크스테이션에서 원격으로 작업할 때 다음과 같은 이유로 커밋 서명을 포기해야 합니다.

$ git commit -S log.h -m "Remove unneeded header"
error: gpg failed to sign the data
fatal: failed to write commit object

저는 SSH, Git, GnuPG에 "표준" 구성을 사용하고 있습니다. 이 설정에 대한 특별한 구성은 모르겠습니다. 그러나 저장소는 내 로컬 LAN에 있습니다(GitHub, GitLab 등은 아님).

$ cat .git/config 
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = ssh://git@callmaster:/var/callboot-src
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

다음에는 특수한 GnuPG conf 파일이 없습니다 $HOME/.gnupg.

$ ls -A ~/.gnupg/
3F537D88ADBC1677-private-key.asc  pubring.kbx
private-keys-v1.d                 trustdb.gpg

검색으로 문제를 찾을 수 없습니다. Git 서명 실패에 대해 많은 정보를 얻었지만 이 특정 상황에 대한 결과는 얻지 못했습니다.

서명이 로컬 및 SSH를 통해 작동하도록 하려면 어떤 구성 옵션이 누락되어 있습니까?


pinentry기계에는 다음이 있습니다 .

$ ls -Al /usr/bin/pinentry-*
-rwxr-xr-x 1 root root 63992 Feb  5  2018 /usr/bin/pinentry-curses
-rwxr-xr-x 1 root root 72184 Feb  5  2018 /usr/bin/pinentry-gnome3
lrwxrwxrwx 1 root root    30 Sep  2 19:14 /usr/bin/pinentry-x11 -> /etc/alternatives/pinentry-x11

그런 다음:

$ ls -Al /etc/alternatives/pinentry-*
lrwxrwxrwx 1 root root 24 Sep  2 19:14 /etc/alternatives/pinentry-x11 -> /usr/bin/pinentry-gnome3
lrwxrwxrwx 1 root root 40 Sep  2 19:14 /etc/alternatives/pinentry-x11.1.gz -> /usr/share/man/man1/pinentry-gnome3.1.gz

답변1

쉘 시작 파일(.bashrc 또는 .zshrc)이 $GPG_TTY 환경 변수를 설정했는지 확인하십시오.

export GPG_TTY=$(tty)

GnuPG가 비밀번호 프롬프트를 표시하는 방식에는 여러 가지 간접 계층이 있습니다. 직접 표시하지 않으며 "pinentry" UI를 직접 실행하지도 않습니다. 대신 몇 가지 관련 환경 변수를gpg-에이전트데몬(모든 세션에서 공유됨), gpg-agent는 올바른 TTY 또는 올바른 X11 디스플레이에서 "pinentry"를 시작하려고 시도합니다.

아직 설명할 수 없는 이유로 인해GPG세션 정보를 다음으로 보냅니다.gpg-에이전트, 실제 TTY 자체를 검색하지 않습니다(또는 파일 설명자로 전달하는 경우도 있음). 그것언제나$GPG_TTY 환경 변수가 존재하고 정보를 포함할 것으로 예상합니다.


대안으로 gpg-agent의 암호 요청이 다시 이동하는 "loopback pinentry" 옵션을 활성화하여 이를 방지할 수 있습니다.GPGpinentry UI를 시작하는 대신.

그렇게 하려면 pinentry-mode loopback~/.gnupg/gpg.conf에 옵션을 추가하십시오.

(이전(구식) GnuPG 버전에서는 ~/.gnupg/gpg-agent.conf에 옵션이 필요할 수도 있으며 allow-loopback-pinentry, 옵션을 추가한 후 로 업데이트해야 합니다 gpg-connect-agent reloadagent /bye. 최신 GnuPG에서는 이미 기본적으로 루프백 모드를 허용합니다.)

관련 정보