web-dev-qa-db-ja.com

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

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

41
user3243135

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

まず、実際に秘密鍵をキャッシュするssh-agent機能とは異なり、gpg-agentは鍵またはパスフレーズのいずれかをキャッシュできます。キャッシュするのは各クライアント次第であり、gpggpg-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_PASSPHRASEを使用してgpg-agent$CACHEIDに再度送信すると、pinentryを使用する代わりに、キャッシュされたパスフレーズが返されます。

ss of dialog box

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>

原則として、おそらくキャッシュされたパスフレーズを順番にエージェントに要求し、出力でOKまたはERRを確認できます。次に、キャッシュIDを生成するにはどうすればよいですか?上記の例でわかるように、gpg-agentは、キャッシュIDとして受け入れることが自由です。 gpgは公開鍵のフィンガープリントを計算し、16進コード化された文字列表現をキャッシュIDとして使用していることがわかりましたが、このフィンガープリントはgpg --fingerprint --list-secret-keysで取得できるフィンガープリントと同じではないことが問題です。このダイジェストはキーグリップと呼ばれます(フィンガープリントはキーマテリアルと作成タイムスタンプに基づいて計算されるのに対して、生のキーマテリアルに対してのみ計算されるため)。このパスを続行したい場合は、チェックする各キーの正しいフィンガープリントを生成する方法を見つける必要があります(これは、次世代のGnuPG 2.1、オプション--with-keygripを使用すると簡単です) 。

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

34
neirbowj

それ以降のバージョンのgnupg(2.1.18でテスト済み)では、以下を使用します。

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

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

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

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

9
gimmesudo

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

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

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

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

7
GeoffreyFrogeye

Cacheidを取得するには、--fingerprint 2回、たとえば:

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

この場合のcacheidはE8514C2510C602910D47A0087C8B4360E50A8F2A

5
Ed Neville

http://lists.gnupg.org/pipermail/gnupg-users/2010-January/037876.html

Cacheidは、キーの完全なフィンガープリントです。

gpg --fingerprint [email protected]
2
John

ウィンドウ(gpg4winを使用)では、次のようにキーをリストできます。

gpg-connect-agent "KEYINFO --ssh-list --ssh-fpr" /bye

使用するSHA1フィンガープリントが必要な場合:

gpg-connect-agent "KEYINFO --ssh-list --ssh-fpr=sha1" /bye

キーのコメントを一覧表示する方法がわかりませんが、%APPDATA%\gnupg\private-keys-v1.d\に保存されているキーで確認できます

2
Victor Guzman