在本地工作站上提交簽名正常,但在同一工作站上透過 SSH 失敗?

在本地工作站上提交簽名正常,但在同一工作站上透過 SSH 失敗?

我正在 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 預設情況下已經允許環回模式。

相關內容