Làm thế nào tôi có thể tìm ra những phím gpg-agent đã lưu trong bộ nhớ cache? (giống như cách ssh-add -l hiển thị cho bạn các khóa ssh được lưu trong bộ nhớ cache)


40

ssh-add -lhiển thị cho bạn tất cả các khóa ssh đã được thêm vào ssh-add ~/.ssh/id_yourkey. Làm thế nào để tôi thực hiện điều tương tự với gpg và gpg-agent, nói cách khác, yêu cầu nó hiển thị danh sách các khóa được lưu trong bộ nhớ cache?

Câu trả lời:


32

Bạn có thể không thể làm điều này, ít nhất là chưa, hoặc ít nhất là không trong trường hợp chung. Tuy nhiên, tôi sẽ chia sẻ những gì tôi đã học được, và mong muốn cập nhật câu trả lời này trong khóa học do.

Trước hết, không giống như ssh-agentkhả năng, thực sự lưu trữ khóa riêng, gpg-agentcó thể lưu trữ khóa hoặc cụm mật khẩu. Tùy thuộc vào từng ứng dụng khách để lưu vào bộ đệm và gpgchỉ sử dụng gpg-agentđể lưu cụm mật khẩu.

Bạn có thể tương tác với gpg-agentviệc sử dụng gpg-connect-agenttiện ích. Trong ví dụ sau, tôi truyền từng lệnh một lần qua 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

Khi gọi gpg-connect-agentvà chuyển trong lệnh này, pinentrylệnh được định cấu hình trên hệ thống của tôi sử dụng chuỗi lỗi, dấu nhắc và mô tả để nhắc cho cụm mật khẩu. Trong trường hợp này, tôi đã nhập "MyPassPhrase", đó là những gì được trả về trong đầu ra có cấu trúc (xem hình ảnh bên dưới) . Nếu tôi gửi GET_PASSPHRASEđến gpg-agentmột lần nữa với cùng $CACHEID, nó sẽ trả về cache cụm từ mật khẩu thay vì sử dụng pinentry.

                                 ss của hộp thoại

GET_PASSPHRASEcũng chấp nhận một --no-asktùy chọn sẽ trả về lỗi trên bộ nhớ cache. Ở đây tôi sử dụng "NotCachedID" làm ID bộ đệm và sử dụng các chuỗi giả cho các đối số được yêu cầu gpg-agentsẽ không sử dụng.

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

Về nguyên tắc, sau đó, bạn có thể yêu cầu tác nhân lần lượt cho từng cụm mật khẩu có thể được lưu trong bộ nhớ cache và kiểm tra OKhoặc ERRtrong đầu ra. Sau đó, câu hỏi trở thành, làm cách nào để tạo ID bộ đệm? Như chúng ta thấy trong ví dụ trên, gpg-agenttự do trong những gì nó chấp nhận là ID bộ đệm. Hóa ra, gpgtính toán dấu vân tay trên khóa chung và sử dụng biểu diễn chuỗi mã hóa hex làm ID bộ đệm, nhưng rắc rối là dấu vân tay này không giống với dấu vân tay bạn có thể tìm hiểu thông quagpg --fingerprint --list-secret-keys. Thông báo này được gọi là keygrip (vì nó chỉ được tính trên vật liệu khóa thô trong khi dấu vân tay được tính toán trên vật liệu chính và dấu thời gian tạo). Nếu bạn thực sự muốn tiếp tục đi xuống con đường này, bạn sẽ phải tìm ra cách tạo dấu vân tay chính xác cho từng phím bạn muốn kiểm tra (điều này sẽ dễ dàng sử dụng thế hệ tiếp theo của GnuPG, 2.1, với tùy chọn --with-keygrip).

Cảnh báo: Đầu ra từ GET_PASSPHRASEthực sự chứa cụm mật khẩu rõ ràng . Ngay cả khi bạn rời khỏi --datatùy chọn, cụm mật khẩu vẫn hiển thị rõ ràng dưới dạng chuỗi mã hóa hex. Đây có thể là một ý tưởng rất tồi (tm) để giải quyết vấn đề này trừ khi bạn biết bạn đang làm gì và thực hiện các biện pháp phòng ngừa thích hợp.


Câu trả lời tuyệt vời! Tôi đã tìm kiếm nhiều ngày và không thể tìm thấy nhiều về điều này. Cách để kết hợp tất cả lại với nhau và giải thích nó một cách rõ ràng và súc tích!
slm

Ảnh chụp màn hình không phải là pinentry nhưng một số chương trình Gnome bị chặn gpg-agent, phải không?
Hauke Laging

gpg-agentgọi bất cứ hương vị nào của pinentrychương trình mà nó được cấu hình để sử dụng. Xem ví dụ thế nào để buộc GPG sang chế độ sử dụng giao diện điều khiển pinentry ... .
neirbowj

Sử dụng gpg-2.1.11được biên dịch từ nguồn trên Ubuntu 14.04, tôi không thể tìm ra gpg-agentid bộ đệm là gì: Tôi đã thử cả keygrips (khóa chính và khóa phụ) và dấu vân tay, như được hiển thị bởi gpg --fingerprint --with-keygrip <user>. Không ai trong số họ làm việc, và gpg-connect-agentluôn báo cáo ERR 67108922 No data <GPG Agent>. Tôi đã kiểm tra lại tác nhân vẫn có cụm mật khẩu bằng cách chạy thành công GPG_TTY= gpg --decrypt <file>sau khi thử các id bộ đệm khác nhau. (Trong trường hợp không rõ ràng, bằng cách bỏ đặt GPG_TTY, giải mã chỉ thành công nếu cụm mật khẩu đã được lưu trong bộ nhớ cache gpg-agent.)
Matei David

2.0,14 có thể bị lỗi không? Sử dụng kỹ thuật trên, gpg-agent thực sự có cụm mật khẩu mong muốn cho khóa được chỉ định (được xác định bởi keygrip), nhưng khi tôi cố gắng đăng nhập với keygrip đó, dù sao tôi cũng được nhắc nhập mật khẩu. Tại sao?
Otheus

8

Trên các phiên bản sau của gnupg (đã thử nghiệm với 2.1.18), hãy sử dụng:

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

để lấy keygrip, sau đó

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

để xem liệu nó được lưu trữ hay không.


5

Trên các phiên bản sau của GnuPG (được thử nghiệm với 2.2.9), cũng có thể liệt kê các keygrip hiện đang được lưu trữ bởi tác nhân sử dụng lệnh keyinfo --listvới gpg-connect-agent.

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

Các 1trong cột thứ bảy chỉ ra rằng keygrip được lưu trữ. Sự kết hợp giữa một keygrip và key mà nó đại diện có thể được lấy ra gpg --list-secret-keys --with-keygrip.

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


3

Để có được bộ đệm, bạn cần đề cập --fingerprinthai lần, ví dụ:

$ 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

Bộ đệm trong trường hợp này sẽ là E8514C2510C602910D47A0087C8B4360E50A8F2A.


Điều này làm việc cho tôi
Matthew Hannigan

Câu trả lời tại unix.stackexchange.com/a/342461/108198 có vẻ tốt hơn.
Ben Creasy

Điều này không làm việc cho tôi ... một --fingerprintso với hai --fingerprint --fingerprintđều trả về cùng một đầu ra. Như @BenCreasy viết, câu trả lời ở trên sử dụng keygrip hoạt động.
Trey

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.