Hangi anahtarların gpg aracısının önbelleğe alındığını nasıl öğrenebilirim? (ssh-add -l'nin ssh anahtarlarını önbelleğe aldığını gösterdiği gibi)


40

ssh-add -lsize eklenen tüm ssh anahtarlarını gösterir ssh-add ~/.ssh/id_yourkey. Gpg ve gpg-agent ile benzerini nasıl yaparım, başka bir deyişle, önbelleğe alınmış anahtarların bir listesini göstermesini isterim?

Yanıtlar:


32

Bunu en azından henüz veya en azından genel durumda yapamayabilirsiniz. Ancak öğrendiklerimi paylaşacağım ve bu cevabın zaman içinde güncellenmesini dört gözle bekleyeceğim.

Her şeyden önce, ssh-agentaslında özel anahtarları önbelleğe alan özelliklerin aksine, gpg-agenttuşları veya parolaları önbelleğe alabilir. Önbelleğe alınacak her istemciye bağlıdır ve gpgyalnızca gpg-agentparolayı önbelleğe almak için kullanır .

Yardımcı programı gpg-agentkullanarak etkileşime girebilirsiniz gpg-connect-agent. Aşağıdaki örnekte, komutları her seferinde STDIN aracılığıyla tek tek iletiyorum.

$ 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-agentBu komutu çağırıp ilettikten sonra , pinentrysistemimde yapılandırılan komut bir parola istemek için error, prompt ve açıklama dizgilerini kullanır. Bu durumda, yapılandırılmış çıktıda döndürülen "MyPassPhrase" 'a girdim (aşağıdaki resme bakın) . Aynı GET_PASSPHRASEşekilde gpg-agenttekrar gönderirsem $CACHEID, kullanmak yerine önbelleğe alınmış parolayı döndürür pinentry.

                                 iletişim kutusunun ss

GET_PASSPHRASEAyrıca --no-askbayan önbellekte hata döndürecek bir seçeneği de kabul eder . Burada önbellek kimliği olarak "NotCachedID" kullanıyorum ve kullanılmayacak gerekli argümanlar için kukla dizeleri gpg-agentkullanıyorum.

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

Prensip olarak, o zaman, ajanı sırayla her önbellekte saklanan parola için sorabilir ve çıktıyı kontrol edebilir OKya da kontrol edebilirsiniz ERR. Sonra soru ortaya çıkıyor, önbellek kimliğini nasıl oluşturabilirim? Yukarıdaki örnekte gördüğümüz gpg-agentgibi, önbellek kimliği olarak kabul ettiği konuda liberaldir. Açık gpganahtar üzerindeki bir parmak izini hesapladığı ve önbellek kimliği olarak onaltılık kodlu bir dize temsili kullandığı ortaya çıkıyor , ancak sorun bu parmak izinin öğrenebileceğiniz parmak izi ile aynı olmamasıdırgpg --fingerprint --list-secret-keys. Bu özet, keygrip olarak adlandırılır (çünkü ham anahtar materyali üzerinde hesaplanır çünkü sadece parmak izi ana materyal ve oluşturma zaman damgası üzerinde hesaplanır). Bu yoldan gerçekten devam etmek istiyorsanız, kontrol etmek istediğiniz tuşların her biri için doğru parmak izini nasıl oluşturacağınızı bulmak zorunda kalacaksınız (bu seçenek, yeni nesil GnuPG, 2.1 seçeneğini kullanmakla kolay olacaktır --with-keygrip).

Uyarı:GET_PASSPHRASE Aslında gelen çıktıda parola bulunur . --dataSeçeneği bıraksanız bile , parola altıgen kodlu bir dize olarak açıkça görünür. Ne yaptığınızı bilmiyorsanız ve uygun önlemleri almıyorsanız, bununla uğraşmak muhtemelen Çok Kötü Bir Fikir'dir (tm).


Müthiş cevap! Günlerdir arıyordum ve bu konuda fazla bir şey bulamadım. Hepsini bir araya getirmenin ve net ve özlü bir şekilde açıklamanın yolu!
slm

Ekran görüntüsü titiz değil, ancak bazı GNOME programlarına müdahale ediyor gpg-agent, değil mi?
Hauke,

gpg-agentKullanmak için pinentryprogramın ne tür bir tadı isterse onu çağırır . Örneğin bakınız kullanım konsol modu pinentry için GPG nasıl zorlanır ... .
neirbowj

gpg-2.1.11Ubuntu 14.04'teki derlenmiş kaynaktan kullanarak gpg-agentönbellek kimliğinin ne olduğunu çözemiyorum: Hem keygrip'leri (ana anahtar ve alt anahtar) hem de anahtar parmak izini gösterildiği gibi denedim gpg --fingerprint --with-keygrip <user>. Hiçbiri işe yaramaz ve gpg-connect-agentdaima rapor verir ERR 67108922 No data <GPG Agent>. Ajanın, GPG_TTY= gpg --decrypt <file>çeşitli önbellek kimliklerini denedikten sonra başarılı bir şekilde çalıştırarak hala parolaya sahip olduğunu kontrol ettim . (Belirsiz olması durumunda, set GPG_TTYçözerek, şifre çözme işlemi yalnızca parola zaten önbelleğe alınmışsa başarılı olur gpg-agent.)
Matei David

2.0.14 engellenebilir mi? Yukarıdaki tekniği kullanarak, gpg-agent gerçekten belirtilen anahtar için istenen şifreye sahiptir (keygrip ile tanımlanır), ancak yine de bu keygrip ile imzalamaya çalıştığımda, yine de bir şifre isteniyor. Neden?
Otheus

8

Daha sonra gnupg sürümlerinde (2.1.18 ile test edilmiştir) kullanın:

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

klavyeyi almak için

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

önbelleğe alınmış olup olmadığını görmek için.


5

(2.2.9 ile test) GnuPG'nin sonraki sürümlerinde şu anda komutunu kullanarak ajan tarafından önbelleğe keygrips listelemek de mümkündür keyinfo --listile gpg-connect-agent.

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

1Yedinci sütunda keygrip önbelleğe olduğunu gösterir. Bir keygrip ve temsil ettiği anahtar arasındaki ilişki ile alınabilir gpg --list-secret-keys --with-keygrip.

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


3

Önbelleği almak için --fingerprintiki kez bahsetmeniz gerekir , örneğin:

$ 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

Bu durumda önbellek olurdu E8514C2510C602910D47A0087C8B4360E50A8F2A.


Bu benim için çalıştı
Matthew Hannigan

Unix.stackexchange.com/a/342461/108198 adresindeki cevap daha iyi görünüyor.
Ben Creasy

Bu benim için işe yaramıyor ... bir --fingerprintya da ikisi --fingerprint --fingerprintaynı çıktıyı verir. @BenCreasy'ın yazdığı gibi, yukarıdaki cevabı keygrip kullanarak çalışır.
Trey

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.