ฉันจะหาคีย์ที่ตัวแทนแคช gpg ได้อย่างไร (เช่นวิธีที่ ssh-add -l แสดงให้คุณเห็นคีย์ ssh ที่แคช)


40

ssh-add -lแสดงให้เห็นว่าทุกท่าน SSH ssh-add ~/.ssh/id_yourkeyคีย์ที่ได้รับการเพิ่มเข้ามาด้วย ฉันจะทำสิ่งที่คล้ายคลึงกับ gpg และ gpg-agent ในคำอื่น ๆ ขอให้มันแสดงรายการของคีย์แคช?

คำตอบ:


32

คุณอาจไม่สามารถทำสิ่งนี้ได้อย่างน้อยยังหรืออย่างน้อยก็ในกรณีทั่วไป อย่างไรก็ตามฉันจะแบ่งปันสิ่งที่ฉันได้เรียนรู้และหวังว่าจะได้อัปเดตคำตอบนี้ในไม่ช้า

ก่อนอื่นไม่เหมือนssh-agentความสามารถซึ่งจริง ๆ แล้วแคชส่วนตัวคีย์gpg-agentสามารถแคชคีย์หรือวลีรหัสผ่านอย่างใดอย่างหนึ่ง มันขึ้นอยู่กับแต่ละไคลเอนต์ที่จะแคชและgpgเพียงแค่ใช้gpg-agentในการแคชข้อความรหัสผ่าน

คุณสามารถโต้ตอบกับการgpg-agentใช้gpg-connect-agentยูทิลิตี้ ในตัวอย่างที่ตามมาฉันกำลังส่งคำสั่งทีละครั้งผ่าน STDIN

$ 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อีกครั้งกับเดียวกันก็จะส่งกลับข้อความรหัสผ่านที่เก็บไว้ชั่วคราวแทนการใช้$CACHEIDpinentry

                                 เอสเอสของกล่องโต้ตอบ

GET_PASSPHRASEยอมรับ--no-askตัวเลือกซึ่งจะส่งคืนข้อผิดพลาดในแคชที่ไม่ได้รับ ที่นี่ฉันใช้ "NotCachedID" เป็นรหัสแคชและใช้สตริงดัมมี่สำหรับอาร์กิวเมนต์ที่จำเป็นที่gpg-agentจะไม่ใช้

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

โดยหลักการแล้วคุณสามารถขอให้ตัวแทนข้อความรหัสผ่านแต่ละแคชอาจจะในทางกลับกันและตรวจสอบOKหรือERRในการส่งออก คำถามก็จะกลายเป็นฉันจะสร้างรหัสแคชได้อย่างไร ตามที่เราเห็นในตัวอย่างข้างต้นgpg-agentมีอิสระในสิ่งที่มันยอมรับเป็นรหัสแคช ปรากฎว่าgpgคำนวณลายนิ้วมือบนกุญแจสาธารณะและใช้การแสดงสตริงเลขฐานสิบหกเป็นรหัสแคช แต่ปัญหาคือว่าลายนิ้วมือนี้ไม่เหมือนกับลายนิ้วมือที่คุณสามารถเรียนรู้ผ่านgpg --fingerprint --list-secret-keys. การแยกย่อยนี้เรียกว่า keygrip (เนื่องจากคำนวณจากวัสดุหลักดิบเท่านั้นในขณะที่มีการคำนวณลายนิ้วมือเหนือวัสดุหลักและเวลาประทับของการสร้าง) ถ้าคุณอยากที่จะดำเนินการต่อไปตามเส้นทางนี้คุณจะต้องไปหาวิธีการสร้างลายนิ้วมือที่ถูกต้องสำหรับแต่ละคีย์ที่คุณต้องการตรวจสอบ (นี้จะเป็นเรื่องง่ายโดยใช้รุ่นต่อไปของ GnuPG, 2.1 กับตัวเลือก--with-keygrip)

คำเตือน:การส่งออกจากGET_PASSPHRASEจริงที่มีวลีรหัสผ่านในที่ชัดเจน แม้ว่าคุณจะเลิกใช้--dataตัวเลือกข้อความรหัสผ่านก็สามารถมองเห็นได้ชัดเจนว่าเป็นสตริงเลขฐานสิบหก มันอาจเป็นความคิดที่แย่มาก (tm) ที่จะเข้าไปยุ่งกับสิ่งนี้เว้นแต่คุณจะรู้ว่าคุณกำลังทำอะไรอยู่และใช้มาตรการป้องกันที่เหมาะสม


คำตอบที่ยอดเยี่ยม! ฉันกำลังมองหาวันและไม่สามารถหามากเกี่ยวกับเรื่องนี้ วิธีรวบรวมทุกอย่างเข้าด้วยกันและอธิบายในแง่ที่ชัดเจนและรัดกุม!
slm

ภาพจากหน้าจอไม่ใช่โปรแกรมพินเนอร์ แต่มีโปรแกรมดักฟัง GNOME gpg-agentบ้าง
Hauke ​​Laging

gpg-agentเรียกใช้สิ่งที่รสชาติของpinentryโปรแกรมที่กำหนดค่าให้ใช้ ดูตัวอย่างวิธีการบังคับให้จีพีจีที่จะใช้โหมดคอนโซล pinentry ...
neirbowj

การใช้gpg-2.1.11ที่รวบรวมจากแหล่งบน Ubuntu 14.04 ฉันไม่สามารถคิดออกว่าgpg-agentรหัสแคช: ฉันพยายามทั้ง keygrips (คีย์หลักและคีย์ย่อย) gpg --fingerprint --with-keygrip <user>และลายนิ้วมือที่สำคัญที่แสดงโดย ไม่มีของพวกเขาทำงานและมักจะรายงานgpg-connect-agent ERR 67108922 No data <GPG Agent>ฉันตรวจสอบซ้ำแล้วซ้ำอีกว่าเอเจนต์ยังมีข้อความรหัสผ่านโดยเรียกใช้งานได้สำเร็จGPG_TTY= gpg --decrypt <file>หลังจากลองรหัสแคชต่างๆ (ในกรณีที่ไม่มีความชัดเจนโดย unsetting GPG_TTYถอดรหัสประสบความสำเร็จ แต่ถ้ารหัสผ่านถูกแคชแล้วโดยgpg-agent.)
Matei เดวิด

สามารถ bugged 2.0.14 ได้ไหม? การใช้เทคนิคด้านบนนั้น gpg-agent จะมีข้อความรหัสผ่านที่ต้องการสำหรับคีย์ที่ระบุ (ระบุโดย keygrip) แต่เมื่อฉันพยายามเซ็นชื่อด้วย keygrip นั้นฉันยังคงได้รับรหัสผ่าน ทำไม?
Otheus

8

ใน gnupg รุ่นที่ใหม่กว่า (ทดสอบกับ 2.1.18) ให้ใช้:

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

เพื่อรับ keygrip จากนั้น

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

เพื่อดูว่าแคชหรือไม่


5

ในรุ่นต่อมาของ GnuPG (ทดสอบกับ 2.2.9) ก็ยังเป็นไปได้ที่จะแสดงรายการ keygrips ที่จะถูกเก็บไว้ในขณะนี้โดยตัวแทนโดยใช้คำสั่งกับkeyinfo --listgpg-connect-agent

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

1ในคอลัมน์เจ็ดบ่งชี้ว่า keygrip ใช้แคช การเชื่อมโยงระหว่าง keygrip และคีย์ที่ใช้แทนสามารถเรียกคืนgpg --list-secret-keys --with-keygripได้

ที่มา: https://demu.red/blog/2016/06/how-to-check-if-your-gpg-key-is-in-cache/


3

ในการรับแคชคุณต้องพูดถึง--fingerprintสองครั้งตัวอย่างเช่น:

$ 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ในกรณีนี้จะเป็น


สิ่งนี้ใช้ได้กับฉัน
Matthew Hannigan

คำตอบที่unix.stackexchange.com/a/342461/108198ดูเหมือนจะดีกว่า
Ben Creasy

สิ่งนี้ไม่ได้ผลสำหรับฉัน ... หนึ่งต่อ--fingerprintสอง--fingerprint --fingerprintทั้งสองคืนผลลัพธ์ที่แน่นอนเหมือนกัน ในขณะที่ @BenCreasy เขียนคำตอบข้างต้นโดยใช้ keygrip ทำงาน
แต้ม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.