gpg-agent가 캐시 한 키를 어떻게 알 수 있습니까? (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_PASSPHRASEgpg-agent다시 보내면 $CACHEID사용하지 않고 캐시 된 암호를 반환합니다 pinentry.

                                 대화 상자의 ss

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) 일 것입니다.


대단한 답변! 나는 며칠 동안 찾고 있었고 이것에 대해 많이 찾을 수 없었습니다. 모든 것을 하나로 모으고 명확하고 간결한 용어로 설명하십시오!
slm

스크린 샷은 문제가 아니지만 일부 그놈 프로그램이 가로 채지 gpg-agent않습니까?
Hauke ​​Laging

gpg-agentpinentry사용하도록 구성된 프로그램 의 특징을 호출 합니다. 예를 들어 GPG가 콘솔 모드 고정 장치를 사용하도록하는 방법 ...을 참조하십시오 .
neirbowj

사용 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.)
Matei David

2.0.14에 버그가있을 수 있습니까? 위의 기술을 사용하여 gpg-agent는 실제로 지정된 키 (키 그립으로 식별)에 원하는 암호를 가지고 있지만 그 키 그립으로 서명하려고 할 때 그럼에도 암호를 묻는 메시지가 표시됩니다. 왜?
Otheus

8

이후 버전의 gnupg (2.1.18로 테스트)에서 다음을 사용하십시오.

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

키 그립을 얻으려면

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

캐시 여부를 확인합니다.


5

이후 버전의 GnuPG (2.2.9로 테스트)에서는 keyinfo --listwith 명령 을 사용하여 에이전트가 현재 캐시 한 키 그립을 나열 할 수도 있습니다 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/


3

캐시 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.


이것은 나를 위해 일했다
Matthew Hannigan

unix.stackexchange.com/a/342461/108198 의 답변 이 더 좋습니다.
벤 Creasy

이것은 나를 위해 작동하지 않습니다 ... 하나 --fingerprint대 둘 --fingerprint --fingerprint다 정확히 동일한 출력을 반환합니다. @ BenCreasy가 쓰는 것처럼 위의 대답은 키 그립을 사용합니다.
Trey

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.