ssh-add -l
hiể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?
ssh-add -l
hiể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:
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-agent
khả năng, thực sự lưu trữ khóa riêng, gpg-agent
có 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à gpg
chỉ sử dụng gpg-agent
để lưu cụm mật khẩu.
Bạn có thể tương tác với gpg-agent
việc sử dụng gpg-connect-agent
tiệ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-agent
và chuyển trong lệnh này, pinentry
lệ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-agent
mộ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
.
GET_PASSPHRASE
cũng chấp nhận một --no-ask
tù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-agent
sẽ 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 OK
hoặc ERR
trong đầ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-agent
tự do trong những gì nó chấp nhận là ID bộ đệm. Hóa ra, gpg
tí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_PASSPHRASE
thực sự chứa cụm mật khẩu rõ ràng . Ngay cả khi bạn rời khỏi --data
tù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.
gpg-agent
, phải không?
gpg-agent
gọi bất cứ hương vị nào của pinentry
chươ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 ... .
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-agent
id 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-agent
luô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
.)
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.
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 --list
với gpg-connect-agent
.
$ gpg-connect-agent 'keyinfo --list' /bye
S KEYINFO 866C3DE249CF81E31A3691845DBADE2809487FF5 D - - 1 P - - -
S KEYINFO 04278155E72CAE8FF1548FE161F1B8F7673824F4 D - - - P - - -
OK
Các 1
trong 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/
Để có được bộ đệm, bạn cần đề cập --fingerprint
hai 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
.
--fingerprint
so 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.
http://lists.gnupg.org/pipermail/gnupg-users/2010-Janemony/037876.html
Bộ đệm là dấu vân tay đầy đủ của phím.
gpg --fingerprint user@foo.bar