ssh-add -l
は、ssh-add ~/.ssh/id_yourkey
で追加されたすべてのsshキーを表示します。 gpgとgpg-agentで同様のことをするにはどうすればいいですか。つまり、キャッシュされたキーのリストを表示するように要求しますか?
少なくともまだ、または少なくとも一般的なケースでは、これを行うことができない場合があります。しかし、私は私が学んだことを共有し、やがてこの答えを更新することを楽しみにしています。
まず、実際に秘密鍵をキャッシュする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_PASSPHRASE
を使用してgpg-agent
を$CACHEID
に再度送信すると、pinentry
を使用する代わりに、キャッシュされたパスフレーズが返されます。
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進コード化された文字列として明確に表示されます。あなたが何をしているかを知らず、適切な予防策をとらない限り、これをいじくるのはおそらく非常に悪い考えです。
それ以降のバージョンのgnupg(2.1.18でテスト済み)では、以下を使用します。
gpg --fingerprint --with-keygrip <email>
キーグリップを取得するには、
echo "KEYINFO --no-ask <keygrip> Err Pmt Des" | gpg-connect-agent
キャッシュされているかどうかを確認します。
新しいバージョンの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
7列目の1
は、キーグリップがキャッシュされていることを示します。キーグリップとそれが表すキーの間の関連付けは、gpg --list-secret-keys --with-keygrip
で取得できます。
ソース: https://demu.red/blog/2016/06/how-to-check-if-your-gpg-key-is-in-cache/
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
。
http://lists.gnupg.org/pipermail/gnupg-users/2010-January/037876.html
Cacheidは、キーの完全なフィンガープリントです。
gpg --fingerprint [email protected]
ウィンドウ(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\
に保存されているキーで確認できます