gpg-agentがキャッシュしたキーを調べるにはどうすればよいですか?(ssh-add -lがキャッシュされたsshキーを表示する方法など)


40

ssh-add -lで追加されたすべてのssh-keyを表示しますssh-add ~/.ssh/id_yourkey。gpgとgpg-agentで同様のことを行うには、つまり、キャッシュされたキーのリストを表示するように依頼するにはどうすればよいですか?

回答:


32

少なくともまだ、または少なくとも一般的なケースでは、これを行うことができない場合があります。しかし、私が学んだことを共有し、やがてこの回答を更新することを楽しみにしています。

まず、ssh-agent秘密キーを実際にキャッシュする機能とは異なり、gpg-agentキーまたはパスフレーズのいずれかをキャッシュできます。キャッシュするのは各クライアント次第で、パスフレーズのキャッシュにgpgのみ使用gpg-agentします。

ユーティリティをgpg-agent使用して対話できgpg-connect-agentます。次の例では、STDINを介してコマンドを1つずつ渡します。

$ CACHEID="ThisIsTheTrickyPart"
$ ERRSTR="Error+string+goes+here"
$ PMTSTR="Prompt"
$ DESSTR="Description+string+goes+here"
$ echo "GET_PASSPHRASE --data $CACHEID $ERRSTR $PMTSTR $DESSTR" | gpg-connect-agent
D MyPassPhrase
OK

gpg-connect-agentこのコマンドを呼び出して渡すとpinentry、システムで設定されたコマンドはエラー、プロンプト、説明の文字列を使用してパスフレーズの入力を求めます。この場合、「MyPassPhrase」と入力しました。これは、構造化された出力で返されます(下の画像を参照)。同じを使っGET_PASSPHRASEgpg-agent再度送信すると$CACHEID、キャッシュパスフレーズを使用する代わりに返しますpinentry

                                 ダイアログボックスのss

GET_PASSPHRASEまた--no-ask、キャッシュミス時にエラーを返すオプションを受け入れます。ここでは、キャッシュIDとして「NotCachedID」を使用し、使用しgpg-agentない必須引数にはダミー文字列を使用します。

$ echo "GET_PASSPHRASE --no-ask NotCachedID Err Pmt Des" | gpg-connect-agent
ERR 67108922 No data <GPG Agent>

原則として、キャッシュされる可能性のある各パスフレーズをエージェントに順番に尋ね、出力を確認するOKERR、出力を確認することができます。質問は次のようになります。キャッシュIDを生成する方法を教えてください。上記の例でわかるようにgpg-agent、キャッシュIDとして受け入れるものは自由です。gpg公開キーのフィンガープリントを計算し、キャッシュIDとして16進コード化された文字列表現を使用していることが判明しましたが、問題は、このフィンガープリントが経由で学習できるフィンガープリントと同じではないことですgpg --fingerprint --list-secret-keys。このダイジェストはキーグリップと呼ばれます(指紋はキーマテリアルと作成タイムスタンプで計算されるのに対して、生のキーマテリアルでのみ計算されるため)。本当にこの道を続けたいのであれば、チェックしたいキーごとに正しいフィンガープリントを生成する方法を見つける必要があります(これは、オプションのGnuPGの次世代バージョン2.1を使用すると簡単になります--with-keygrip)。

警告:からの出力GET_PASSPHRASEには、実際にクリアなパスフレーズが含まれています。--dataオプションを省略した場合でも、パスフレーズは16進コードの文字列として明確に表示されます。あなたが何をしているのかを知らない限り、これをいじくり回し、適切な予防策を講じることはおそらく非常に悪い考えです。


素晴らしい答えです!私は何日も探していましたが、これについてはあまり見つけることができませんでした。それをすべてまとめて、明確で簡潔な用語で説明する方法!
slm

スクリーンショットはピンポイントではありませんが、いくつかのGNOMEプログラムがインターセプトgpg-agentしますか?
ホークレイジング14

gpg-agentpinentry使用するように構成されているプログラムのフレーバーを呼び出します。例えば参照してください...コンソールモードのpinentryを使用するためにGPGを強制する方法
neirbowj

gpg-2.1.11Ubuntu 14.04のソースからコンパイルしたものを使用すると、gpg-agentキャッシュIDが何なのかわかりませんgpg --fingerprint --with-keygrip <user>。どれも機能せず、gpg-connect-agent常に報告しERR 67108922 No data <GPG Agent>ます。GPG_TTY= gpg --decrypt <file>さまざまなキャッシュIDを試した後、正常に実行することにより、エージェントがまだパスフレーズを持っていることを再確認しました。(不明な場合GPG_TTY、設定解除により、パスフレーズが既にキャッシュされている場合にのみ復号化が成功しgpg-agentます。)
Matei David

2.0.14にバグがありますか?上記の手法を使用すると、gpg-agentは指定されたキー(keygripで識別される)に必要なパスフレーズを実際に持っていますが、そのkeygripで署名しようとすると、それでもパスワードの入力を求められます。どうして?
オテウス

8

gnupgの新しいバージョン(2.1.18でテスト済み)では次を使用します。

gpg --fingerprint --with-keygrip <email>

キーグリップを取得するには、

echo "KEYINFO --no-ask <keygrip> Err Pmt Des" | gpg-connect-agent

キャッシュされているかどうかを確認します。


5

GnuPGの新しいバージョン(2.2.9でテスト済み)では、でコマンドkeyinfo --listを使用して、エージェントによって現在キャッシュされているキーグリップをリストすることもできgpg-connect-agentます。

$ gpg-connect-agent 'keyinfo --list' /bye
S KEYINFO 866C3DE249CF81E31A3691845DBADE2809487FF5 D - - 1 P - - -
S KEYINFO 04278155E72CAE8FF1548FE161F1B8F7673824F4 D - - - P - - -
OK

1第7列にはkeygripがキャッシュされていることを示しています。キーグリップとそれが表すキーの間の関連付けは、で取得できますgpg --list-secret-keys --with-keygrip

ソース:https : //demu.red/blog/2016/06/how-to-check-if-your-gpg-key-is-in-cache/


3

cacheidを取得するには--fingerprint、たとえば、2回言及する必要があります。

$ gpg --fingerprint --fingerprint ftpadmin@kernel.org
pub   1024D/517D0F0E 2000-10-10
      Key fingerprint = C75D C40A 11D7 AF88 9981  ED5B C86B A06A 517D 0F0E
uid                  Linux Kernel Archives Verification Key <ftpadmin@kernel.org>
sub   4096g/E50A8F2A 2000-10-10
      Key fingerprint = E851 4C25 10C6 0291 0D47  A008 7C8B 4360 E50A 8F2A

この場合のcacheidはになりますE8514C2510C602910D47A0087C8B4360E50A8F2A


これは私のために働いた
マシューハニガン

unix.stackexchange.com/a/342461/108198での回答の方が良いようです。
ベンクリーシー

これは私にはうまくいきません... 1 --fingerprint対2は--fingerprint --fingerprint両方ともまったく同じ出力を返します。@BenCreasyが書いているように、キーグリップを使用した上記の答えは機能します。
トレイ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.