
저는 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에서는 이미 기본적으로 루프백 모드를 허용합니다.)