답변:
적어도 아직 또는 적어도 일반적인 경우에는이 작업을 수행하지 못할 수 있습니다. 그러나 배운 내용을 공유하고 적절한 답변으로이 답변을 업데이트 할 수 있기를 기대합니다.
우선 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"를 캐시 ID로 사용하고 사용 gpg-agent
하지 않을 필수 인수에 더미 문자열을 사용합니다.
$ echo "GET_PASSPHRASE --no-ask NotCachedID Err Pmt Des" | gpg-connect-agent
ERR 67108922 No data <GPG Agent>
원칙적으로 에이전트는 캐시 된 각 암호 구를 차례로 요청 하고 출력을 확인 OK
하거나 ERR
출력 할 수 있습니다. 그러면 캐시 ID를 어떻게 생성합니까? 위의 예에서 볼 수 있듯이 gpg-agent
캐시 ID로 받아들이는 것은 자유 롭습니다. gpg
공개 키의 지문 을 계산하고 16 진수 코드화 된 문자열 표현을 캐시 ID로 사용하는 것으로 나타 났지만 문제는이 지문이 배울 수있는 지문과 동일하지 않다는 것입니다gpg --fingerprint --list-secret-keys
. 이 다이제스트를 키 그립 (keygrip)이라고합니다 (원인 키 자료에 대해서만 계산되기 때문에 지문은 키 자료와 생성 타임 스탬프에 대해 계산되므로). 이 경로를 계속 진행하려면 확인하려는 각 키에 대해 올바른 지문을 생성하는 방법을 찾아야합니다 (이 옵션은 차세대 GnuPG 2.1을 사용하면 쉬울 것입니다 --with-keygrip
).
경고 : 의 출력 GET_PASSPHRASE
에는 실제로 암호 문구가 clear에 포함되어 있습니다 . --data
옵션을 해제하더라도 비밀번호 문구는 16 진 코드 문자열로 표시됩니다. 자신이하고있는 일을 알지 못하고 적절한 예방 조치를 취하지 않는 한이 문제를 해결하는 것은 매우 나쁜 생각 (tm) 일 것입니다.
gpg-agent
않습니까?
gpg-2.1.11
우분투 14.04에 소스에서 컴파일, 내가 무엇을 알아낼 수 없습니다 gpg-agent
내가 모두 keygrips (주요 키와 하위 키)와 키 지문을 시도, 같이 : 캐시 ID입니다 gpg --fingerprint --with-keygrip <user>
. 그들 중 어느 것도 작동하지 않으며 gpg-connect-agent
항상보고합니다 ERR 67108922 No data <GPG Agent>
. GPG_TTY= gpg --decrypt <file>
다양한 캐시 ID를 시도한 후에 에이전트를 성공적으로 실행하여 에이전트에 여전히 암호 문구가 있는지 다시 확인했습니다 . (확실하지 않은 경우, 설정을 해제 GPG_TTY
하면 암호가 이미 캐시되어있는 경우에만 암호 해독에 성공합니다 gpg-agent
.)
이후 버전의 GnuPG (2.2.9로 테스트)에서는 keyinfo --list
with 명령 을 사용하여 에이전트가 현재 캐시 한 키 그립을 나열 할 수도 있습니다 gpg-connect-agent
.
$ gpg-connect-agent 'keyinfo --list' /bye
S KEYINFO 866C3DE249CF81E31A3691845DBADE2809487FF5 D - - 1 P - - -
S KEYINFO 04278155E72CAE8FF1548FE161F1B8F7673824F4 D - - - P - - -
OK
1
일곱 번째 컬럼은 keygrip 캐시 것을 나타낸다. 키 그립과 키 그립이 나타내는 키 간의 연결은로 검색 할 수 있습니다 gpg --list-secret-keys --with-keygrip
.
출처 : https://demu.red/blog/2016/06/how-to-check-if-your-gpg-key-is-in-cache/
캐시 ID를 얻으려면 다음과 같이 --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
이 경우 캐시 ID는입니다 E8514C2510C602910D47A0087C8B4360E50A8F2A
.
--fingerprint
대 둘 --fingerprint --fingerprint
다 정확히 동일한 출력을 반환합니다. @ BenCreasy가 쓰는 것처럼 위의 대답은 키 그립을 사용합니다.
http://lists.gnupg.org/pipermail/gnupg-users/2010-January/037876.html
cacheid는 키의 전체 지문입니다.
gpg --fingerprint user@foo.bar