web-dev-qa-db-ja.com

コミットに署名するときにgitがGnuPGパスワードを要求しないようにします

Gitは、を使用してコミットに署名するときに、秘密鍵のロックを解除するためのパスフレーズを入力するように常に要求します。

git commit -S -m 'message'

コミットに署名するたびにパスワードを入力する必要がないように、パスワードをキャッシュに保存するにはどうすればよいですか?

15
pokemon

GitがGnuPGパスフレーズを取得することはありません。パスフレーズをキャッシュするGnuPGの機能に依存する必要があります。これは、gpg-agent(WindowsのAppDataフォルダーのどこかに非表示)を編集することで簡単に設定できる~/.gnupg/gpg-agent.confを介して行われます。

default-cache-ttlを、GnuPGを呼び出すたびにパスフレーズがキャッシュされる秒数に設定します。 maximum-cache-ttlは、パスフレーズが最初に入力されてからキャッシュが消去される時間を設定します。 ignore-cache-for-signingが設定されていないことを確認してください。設定されていない場合、GnuPGは署名操作のキャッシュを無視します。

ユーザーの操作なしでコミットに署名する場合は、gpg-preset-passphraseを介してキャッシュを事前に入力できます。多くの場合、/usr/lib/gnupg2/gpg-preset-passphraseのような場所のどこかに隠されています。または、任意の復号化または署名操作を実行します。 --passphrase [your passphrase]のようなオプションを使用してgpgに渡すようにgitを構成することもできますが、このアプローチの制限とセキュリティへの影響を確認してください(パスフレーズがプレーンテキストのどこかに保存されている必要があります)。

オプションの完全なリストは ここ です。

14
Jens Erat

Ubuntu 18.04にアップデートした後、gnome-keyringがGPGエージェントを実装しなくなり、gpg-agentにパスフレーズをキャッシュさせることができなかったため、以前のすべてのソリューションが機能しなくなりました。

これが私のために最終的に働いた解決策です:

スクリプトを作成するgpg-without-tty

#!/bin/bash
echo $(secret-tool lookup gpgpassphrase $GPGKEY) | /usr/bin/gpg --batch \
    --no-tty --pinentry-mode loopback --passphrase-fd 0 "$@"

Gnome-keyringで$ GPGKEYのパスフレーズを設定します。

secret-tool store --label='Passphrase for GPG Key' gpgpassphrase $GPGKEY

Gitにgpg-without-ttyスクリプトを使用するように指示します。

git config --global gpg.program /path/to/gpg-without-tty

allow-loopback-pinentry設定を~/.gnupg/gpg-agent.confに追加する必要がある場合もあります。

更新:これはローカルで機能しましたが、どういうわけか署名を台無しにしたことが判明しました。完全な40文字のフィンガープリントでコミットに署名しました。 GitHubは、これらの署名が有効であると認識しませんでした。そして、18.04(git log --show-signature)に更新する前に署名した古いコミットを見ると、それらはもはや有効として表示されませんでした。結局、gitconfigのgpg.program設定を削除しました。私が遭遇した問題は、おそらくそもそもその設定を持っていることに関連していることがわかりました(私は過去に別の問題を回避するために使用しました)。

つまり、git config --global --unset gpg.programを実行することが、更新後の私の問題に対する答えでした。

1
decocijo