
我正在 Ubuntu 18.04.3 LTS x86_64 機器上工作(已完全修補)。該機器有 GNOME3 桌面。有時我坐在工作站前,有時我會透過 SSH 連接到工作站。
當坐在工作站上時,Git 提交簽名有效。我使用了git commit -S ... -m ...
,一切都按預期進行。我收到一個 UI 提示,要求輸入我的 GnuPG 密碼,工作流程如常。
當我透過 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
確保您的 shell 啟動檔案(.bashrc 或 .zshrc)設定了 $GPG_TTY 環境變數:
export GPG_TTY=$(tty)
GnuPG 顯示密碼提示的方式有多個間接層。它不會直接顯示它們,甚至不直接啟動“pinentry”UI - 而是將一些相關的環境變數傳遞給gpg-代理守護程式(在所有會話中共用),然後 gpg-agent 嘗試在正確的 TTY 或正確的 X11 顯示器上啟動「pinentry」。
由於某些尚未解釋的原因,當GPG將會話訊息傳送到gpg-代理,它不會自己查找真正的 TTY(甚至將其作為文件描述符傳遞);它總是期望 $GPG_TTY 環境變數存在並包含資訊。
作為替代方案,您可以透過啟用「loopback pinentry」選項來避免這種情況,其中 gpg-agent 的密碼請求會返回到GPG而不是啟動 pinentry UI。
為此,請將該選項新增pinentry-mode loopback
至 ~/.gnupg/gpg.conf。
(在較舊(過時)的 GnuPG 版本中,您可能還需要 ~/.gnupg/gpg-agent.conf 中的選項allow-loopback-pinentry
,添加它後,您需要使用 進行更新gpg-connect-agent reloadagent /bye
。最新的GnuPG 預設情況下已經允許環回模式。