ローカルワークステーションではコミット署名は正常に行われますが、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エージェント実際のTTYを自分で検索したり、ファイル記述子として渡したりすることはありません。いつも$GPG_TTY 環境変数が存在し、情報が含まれていることが想定されています。


代わりに、「ループバックピンエントリ」オプションを有効にすることで、これを回避できます。このオプションを有効にすると、gpg-agentのパスフレーズ要求がグーグルpinentry UI を起動する代わりに。

pinentry-mode loopbackこれを行うには、 ~/.gnupg/gpg.conf にオプションを追加します。

(古い (時代遅れの) GnuPG バージョンでは、~/.gnupg/gpg-agent.conf にオプションも必要になる場合があります。allow-loopback-pinentryオプションを追加した後は、 で更新する必要がありますgpg-connect-agent reloadagent /bye。最新の GnuPG では、ループバック モードがデフォルトで許可されています。)

関連情報