ssh-add -l
แสดงให้เห็นว่าทุกท่าน SSH ssh-add ~/.ssh/id_yourkey
คีย์ที่ได้รับการเพิ่มเข้ามาด้วย ฉันจะทำสิ่งที่คล้ายคลึงกับ gpg และ gpg-agent ในคำอื่น ๆ ขอให้มันแสดงรายการของคีย์แคช?
ssh-add -l
แสดงให้เห็นว่าทุกท่าน SSH ssh-add ~/.ssh/id_yourkey
คีย์ที่ได้รับการเพิ่มเข้ามาด้วย ฉันจะทำสิ่งที่คล้ายคลึงกับ gpg และ gpg-agent ในคำอื่น ๆ ขอให้มันแสดงรายการของคีย์แคช?
คำตอบ:
คุณอาจไม่สามารถทำสิ่งนี้ได้อย่างน้อยยังหรืออย่างน้อยก็ในกรณีทั่วไป อย่างไรก็ตามฉันจะแบ่งปันสิ่งที่ฉันได้เรียนรู้และหวังว่าจะได้อัปเดตคำตอบนี้ในไม่ช้า
ก่อนอื่นไม่เหมือน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
อีกครั้งกับเดียวกันก็จะส่งกลับข้อความรหัสผ่านที่เก็บไว้ชั่วคราวแทนการใช้$CACHEID
pinentry
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) ที่จะเข้าไปยุ่งกับสิ่งนี้เว้นแต่คุณจะรู้ว่าคุณกำลังทำอะไรอยู่และใช้มาตรการป้องกันที่เหมาะสม
gpg-agent
บ้าง
gpg-agent
เรียกใช้สิ่งที่รสชาติของpinentry
โปรแกรมที่กำหนดค่าให้ใช้ ดูตัวอย่างวิธีการบังคับให้จีพีจีที่จะใช้โหมดคอนโซล pinentry ...
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
.)
ใน gnupg รุ่นที่ใหม่กว่า (ทดสอบกับ 2.1.18) ให้ใช้:
gpg --fingerprint --with-keygrip <email>
เพื่อรับ keygrip จากนั้น
echo "KEYINFO --no-ask <keygrip> Err Pmt Des" | gpg-connect-agent
เพื่อดูว่าแคชหรือไม่
ในรุ่นต่อมาของ GnuPG (ทดสอบกับ 2.2.9) ก็ยังเป็นไปได้ที่จะแสดงรายการ keygrips ที่จะถูกเก็บไว้ในขณะนี้โดยตัวแทนโดยใช้คำสั่งกับkeyinfo --list
gpg-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/
ในการรับแคชคุณต้องพูดถึง--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
ในกรณีนี้จะเป็น
--fingerprint
สอง--fingerprint --fingerprint
ทั้งสองคืนผลลัพธ์ที่แน่นอนเหมือนกัน ในขณะที่ @BenCreasy เขียนคำตอบข้างต้นโดยใช้ keygrip ทำงาน
http://lists.gnupg.org/pipermail/gnupg-users/2010-January/037876.html
แคชเป็นลายนิ้วมือเต็มของกุญแจ
gpg --fingerprint user@foo.bar