
私は 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 では、ループバック モードがデフォルトで許可されています。)