GPG-트러스트 체인을 만들지 않고 서명을 확인 하시겠습니까?


19

gpg (또는 gpg4win)에게 파일을 가져와 서명하고 신뢰할 필요없이 특정 공개 키 파일로 서명했는지 여부를 물어볼 수 있습니까?

즉, 같은

gpg --using-key pubkey.txt --verify message.txt

자신의 개인 키를 만든 다음

gpg --import pubkey.txt 
gpg --lsign-key [name within pubkey.txt]
# ... something to do with choosing trust levels
gpg --verify message.txt

1
명령 gpg --status-fd 1 --verify (thefile)이 출력을 통해 서명을 만든 키의 지문을 첫 번째 문자열로 제공 하는지 확인하십시오 .
harrymc

여기에 어떤 맥락이 있습니다 : 우리는 사물에 서명하는 시스템을 가지고 있습니다. 이 시스템에서 메시지를 수신 할 수있는 사용자에게 공개 키를 제공하여 메시지가 변경되지 않았 음을 확인할 수 있습니다. 그러나 수신자에게 " 이 키로 서명 된 것을 신뢰"하도록 지시하고 싶지 않습니다. 다른 시스템의 메시지 (예 : 친구의 이메일)를 인증하는 데 사용될 수 있기 때문입니다.
OJW

그래서 우리는 누군가에게 "gpg가이 메시지가이 키에 의해 전송되었다고 말하는가?" 다른 사람들과 의사 소통하기 위해 일상적인 gpg 사용을 방해하지 않습니다. GPG는 항상 키를 신뢰하라는 명령이 아니기 때문에 명령 행이 키를 요청하기 때문에 키를 신뢰해야합니다.
OJW

답변:


14

해당 개인 키로 서명을 확인하려면 공개 키가 있어야하지만 키에 서명하거나 로컬로 서명 할 필요는 없습니다. 이 경우 GPG로부터 키를 신뢰할 수 없다는 경고를 받게됩니다.

내 키로 서명 한 파일로 키를 가져 오지 않은 시스템에서 테스트 한 내용은 다음과 같습니다.

[ben@seditious tmp]$ gpg -v --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: Can't check signature: public key not found
[ben@seditious tmp]$ gpg -v --status-fd 1 --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
[GNUPG:] ERRSIG 7FF2D37135C7553C 1 10 00 1380142299 9
[GNUPG:] NO_PUBKEY 7FF2D37135C7553C
gpg: Can't check signature: public key not found
[ben@seditious tmp]$ 

불행히도 Harry의 제안은 효과가 없으며 약간 더 많은 정보를 추출하지만 사용하기에는 충분하지 않습니다.

보시다시피, 가장 많이 얻은 정보는 서명을하는 데 사용 된 하위 키의 키 ID와 서명 시간입니다. 이는 pgpdump (또는 --list-packets)에 사용 가능한 데이터와 일치합니다.

bash-3.2$ pgpdump thing.txt.gpg 
Old: Compressed Data Packet(tag 8)
    Comp alg - ZLIB <RFC1950>(comp 2)
Old: One-Pass Signature Packet(tag 4)(13 bytes)
    New version(3)
    Sig type - Signature of a binary document(0x00).
    Hash alg - SHA512(hash 10)
    Pub alg - RSA Encrypt or Sign(pub 1)
    Key ID - 0x7FF2D37135C7553C
    Next packet - other than one pass signature
Old: Literal Data Packet(tag 11)(24 bytes)
    Format - binary
    Filename - thing.txt
    File modified time - Thu Sep 26 06:51:39 EST 2013
    Literal - ...
Old: Signature Packet(tag 2)(412 bytes)
    Ver 4 - new
    Sig type - Signature of a binary document(0x00).
    Pub alg - RSA Encrypt or Sign(pub 1)
    Hash alg - SHA512(hash 10)
    Hashed Sub: signature creation time(sub 2)(4 bytes)
        Time - Thu Sep 26 06:51:39 EST 2013
    Sub: issuer key ID(sub 16)(8 bytes)
        Key ID - 0x7FF2D37135C7553C
    Hash left 2 bytes - f0 97 
    RSA m^d mod n(3066 bits) - ...
        -> PKCS-1
bash-3.2$ 

보시다시피 해시 알고리즘, 키 유형의 세부 정보 (내 서명 키는 3072 비트 RSA 하위 키 및 하위 키의 키 ID이지만 마스터 키를 식별 할 수는 없습니다. 공개 키가 있고 서명을 확인하면 공개됩니다.

그런 다음 해당 시스템에서 공개 키를 가져 와서 다시 시도했습니다.

[ben@seditious tmp]$ gpg -v --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: using PGP trust model
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: DB47 24E6 FA42 86C9 2B4E  55C4 321E 4E23 7359 0E5D
     Subkey fingerprint: B7F0 FE75 9387 430D D0C5  8BDB 7FF2 D371 35C7 553C
gpg: binary signature, digest algorithm SHA512
[ben@seditious tmp]$ 

이제 키를 식별하고 기본 키와 일치시킬 수 있습니다. 그러나 다음과 같은 경고의 특성을 줄이는 것이 가능합니다.

[ben@seditious tmp]$ gpg -v --verify --trust-model always thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg: WARNING: Using untrusted key!
gpg: binary signature, digest algorithm SHA512
[ben@seditious tmp]$ 

여전히 신뢰할 수없는 키라는 경고가 있지만, 그렇게 큰 것은 아니며 자세한 정보를 제거하면 키가 줄어 듭니다.

[ben@seditious tmp]$ gpg --verify --trust-model always thing.txt.gpg 
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg: WARNING: Using untrusted key!
[ben@seditious tmp]$ 

공개 키는 서명자가 생성 한 데이터를 개인 키와 일치시키는 데 사용되므로 확인 단계에 필요합니다. 간단히 말해서 공개 키로 암호화 된 데이터를 해독하기 위해 개인 키가 필요한 암호화의 보완이라고 생각할 수 있습니다.

참고 :이 예제에서 UID를 약간 조정했지만 해당 키를 얻는 사람은 누구나 실제로 무엇인지 알 수 있습니다. 그렇지 않으면 출력물은 직선 복사하여 붙여 넣습니다.

편집 : 공개 키 파일을 ASCII가 아닌 형식으로 (예 : .asc 파일 대신 .gpg 파일) 키 링처럼 직접 호출 할 수 있습니다. 그럼에도 불구하고 여전히 공개 키가 필요합니다. 이렇게하려면 명령은 다음과 같습니다.

[ben@seditious ~]$ gpg -v --no-default-keyring --keyring /tmp/mykey.gpg --verify /tmp/thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: using PGP trust model
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: DB47 24E6 FA42 86C9 2B4E  55C4 321E 4E23 7359 0E5D
     Subkey fingerprint: B7F0 FE75 9387 430D D0C5  8BDB 7FF2 D371 35C7 553C
gpg: binary signature, digest algorithm SHA512
[ben@seditious ~]$ 

귀하의 결과를 보면 정확히 반대되는 결론에 도달했습니다. 나는 내 대답에 당신의 결과물을 사용했지만 그에 대한 신용을 주었다.
harrymc

하위 키의 키 ID의 긴 형식 (기술적으로 전체 키 ID 지문) 인 부분 만 식별 할 수있는 부분입니다. 그러나 공개 키가 없으면 마스터 키를 식별하거나 서명을 확인할 수 없습니다 . 이에 대한 자세한 내용은 RFC 4880의 섹션 5.2에 있습니다 (섹션 2.2에는 약간 있지만 5.2는 유용한 항목입니다). 내가 틀렸다면 키 사본없이 확인을 증명하십시오 (힌트 : 내 예제로는 할 수 없습니다).
Ben

또한 --verify에 대한 결론에서 키를 사용할 수있을 때만 작동합니다. 그렇지 않으면 키 ID와 서명 시간이 확인되었지만 키를 찾을 수없는 첫 번째 예제로 돌아가십시오.
Ben

예, 물론 키 ID만으로는 완전한 식별이 불가능합니다. 나는 이것이 휴리스틱 일 뿐이라는 것을 분명히 진술하기 위해 대답을 수정했습니다. 당신의 결론은 포스터가 요구하는 것이 불가능하다는 것이지만, 아마도 포스터가 너무 강한 "확인"이라는 단어를 사용했기 때문일 것입니다.
harrymc

1
사실, OP는 아마도 용어를 올바르게 사용하지 않을 수 있으며 두 곳에서 용어를 퍼지했을 수도 있습니다 ( 어제 밤 에 재채기를 많이했습니다 ). 그의 질문이 키를 가져 오지 않고 시그의 유효성을 검사하는 것에 관한 것이라면, 편집의 예는 키가 OpenPGP (pubkey.gpg) 형식 인 경우 에만 수행 방법을 보여줍니다 . 내 보낸 키가 ASCII 형식 (pubkey.asc) 형식이면 작동하지 않습니다.
Ben

2

공개 키 파일이 아닌 키 링을 제공해도 괜찮다면 다음 gpgv보다는 gpg다음 을 사용하는 것이 좋습니다 .

gpgv --keyring key.ring somefile.txt

0

질문에서 "확인"이라는 단어가 "절대적으로 확인"을 의미하는 경우 서명 된 문서를 완전히 확인하려면 공개 키를 가져와야합니다. 그러나 이것이 "식별"을 의미하는 경우 문서 그룹이 모두 동일한 서명으로 서명되었는지 여부를 알 수있는 휴리스틱을 아래에 설명합니다.

@Ben 이 내 의견을 확인하기 위해 수행테스트 에 따르면 서명 키를 경험적으로 나타내는 데 다음 명령을 사용할 수 있습니다.

gpg --status-fd 1 --verify thefile.gpg

벤 테스트 결과는 다음과 같습니다. ERRSIG 및 NO_PUBKEY의 값과 다음과 같이 부분적으로 포함 된 "RSA 키 ID"의 값이 중요합니다.

[ben@seditious tmp]$ gpg -v --status-fd 1 --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
[GNUPG:] ERRSIG 7FF2D37135C7553C 1 10 00 1380142299 9
[GNUPG:] NO_PUBKEY 7FF2D37135C7553C
gpg: Can't check signature: public key not found

문자열 위에 유의하십시오 7FF2D37135C7553C. 키를 가져 오면보고되는 키 지문 안에 동일한 문자열이 있습니다.

[ben@seditious ~]$ gpg -v --no-default-keyring --keyring /tmp/mykey.gpg --verify /tmp/thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: using PGP trust model
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: DB47 24E6 FA42 86C9 2B4E  55C4 321E 4E23 7359 0E5D
     Subkey fingerprint: B7F0 FE75 9387 430D D0C5  8BDB 7FF2 D371 35C7 553C
gpg: binary signature, digest algorithm SHA512

이 문자열은 지문의 하위 부분 (위의 하위 키)으로 발견되므로 키를 식별하는 데 사용될 수 있습니다. 하위 키 외에 "기본 키 지문"도 확인해야합니다.

"RSA 키 ID"문자열은 두 출력에서 ​​동일하며 지문의 마지막 부분으로도 발견되므로 서명 자체를 식별하기에 충분할 수 있습니다. 이 경우 출력 만 사용 gpg --verify하면 더 간단한 방식으로 서명을 식별하기에 충분할 수 있습니다.

[ben@seditious tmp]$ gpg -v --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: Can't check signature: public key not found

GPG에 대한 나의 지식만으로는이 방법을 완전히 검증 할 수 없으므로 더 많은 예제 파일에서 시도해야합니다. 작동하는 경우 서명에 따라 파일을 정렬 할 수 있지만 서명자의 신원을 찾으려면 키를 가져와야합니다.

다시 명확하게 설명하려면 :이 방법은 서명을 완전히 식별 할 수 없습니다. 서명 된 문서를 경험적으로 정렬하는 방법 일뿐입니다.


서명에는 키를 만드는 데 사용되는 키를 식별하기에 충분한 데이터가 포함되어 있으며 키 서버와 함께 마스터 키를 찾는 데 사용할 수 있습니다 (서명 하위 키가 내 예에서 사용되었다고 가정). OpenPGP 형식의 공개 키 사본 (키링 또는 최종 예제)이 없으면 지문 / 키 ID가이를 계산하기에 충분한 데이터가 아니기 때문에 서명을 확인할 수 없습니다.
Ben

@Ben : 이것이 휴리스틱 일 뿐이라고 반복합니다. 이것은 포스터의 질문에 답할 수있는 최선의 방법입니다. "키 를 가져 와서 서명하고 신뢰할 필요없이 특정 공개 키 파일로 파일이 서명되었는지 확인 ".
harrymc

.pub 파일의 키를 신뢰할 수 있다고 말하고 (이 특정 데이터 파일을 확인하기위한 목적으로)이 .pub 파일을 신뢰하기로 선택한 이유가 GPG 활동이 있습니까?
OJW

.pub 파일에 키를 나열하고 RSA 키 ID를 비교하는 휴리스틱이 유용합니까? 여기에 gpg가 없지만 "gpg --no-default-keyring --keyring <pub-file> --list-keys"와 같은 것이 있습니다.
harrymc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.