BASH 스크립트에서 PGP 서명을 확인하는 올바른 방법(정확한 긴 지문 수정)

BASH 스크립트에서 PGP 서명을 확인하는 올바른 방법(정확한 긴 지문 수정)

나는 가지고있다:

  1. 하나의 문서
  2. ASCII armor 형식의 파일에 대한 독립적인 PGP 서명 및
  3. 유효한 서명이 있어야 하는 키를 식별하는 40자(긴 형식) 지문

gpg주어진 서명이 주어진 파일에 대해 유효한지 확인하기 위해 *nix에서 명령을 사용하여 BASH 스크립트를 작성하는 올바른 방법은 무엇입니까(지정된 지문에 대해서만)?

참고: 이상적으로 솔루션은 gpgSTDOUT을 --에서 구문 분석하지 않으므로 제공된 솔루션의 BASH 스크립트는 나중에 출력의 단어나 형식이 약간 변경되더라도 중단되지 않습니다.

그리고 특히 중요한 점은 별도의 서명이 여러 키로 서명될 수 있다는 것입니다. 따라서 예를 들어 공격자가 파일과 해당 분리된 서명을 획득하고 분리된 서명에 자신의 서명을 추가하면서 파일을 편집하는 경우 이 솔루션은 실패합니다. 이 공격에서 우리가 스크립트에 고정한 지문의 키는 잘못된 서명으로 표시되는 반면 공격자의 키는 좋은 서명으로 표시되므로 이는 관련이 없습니다. 이 경우 해결책은 실패할 수밖에 없습니다.

예를 들어, 다음 상황을 고려해보세요.

  1. https://files.pythonhosted.org/packages/cb/85/8a1588a04172e0853352ecfe214264c65a62ab35374d9ad9c569cf94c2a3/python_gnupg-0.4.6-py2.py3-none-any.whl
  2. https://files.pythonhosted.org/packages/cb/85/8a1588a04172e0853352ecfe214264c65a62ab35374d9ad9c569cf94c2a3/python_gnupg-0.4.6-py2.py3-none-any.whl.asc
  3. CA749061914EAC138E66EADB9147B477339A9B86

현재 BASH 스크립트에는 다음이 있습니다.

#!/bin/bash

ONLY_TRUST_THIS_FINGERPRINT='CA749061914EAC138E66EADB9147B477339A9B86'

tmpDir="`mktemp -d`" || exit 1
pushd "${tmpDir}"

wget https://files.pythonhosted.org/packages/cb/85/8a1588a04172e0853352ecfe214264c65a62ab35374d9ad9c569cf94c2a3/python_gnupg-0.4.6-py2.py3-none-any.whl
wget https://files.pythonhosted.org/packages/cb/85/8a1588a04172e0853352ecfe214264c65a62ab35374d9ad9c569cf94c2a3/python_gnupg-0.4.6-py2.py3-none-any.whl.asc
wget https://keys.openpgp.org/vks/v1/by-fingerprint/CA749061914EAC138E66EADB9147B477339A9B86

mkdir gnupg
gpg --homedir "${tmpDir}/gnupg" --import CA749061914EAC138E66EADB9147B477339A9B86

파일에 고정된 지문과 일치하는 개인 키의 유효한 서명이 있는지 안전하게 확인하려면 위 스크립트에서 어떤 명령을 따라야 합니까?

gpg --verify ...편집: 다음은 공격자의 좋은 서명과 실제 개발자의 잘못된 서명이 포함된 간단한 출력 예입니다 .

user@disp2952:/tmp/tmp.nUmxfwbwfK$ gpg --homedir gnupg/ --verify python_gnupg-0.4.6-py2.py3-none-any.whl.asc
gpg: WARNING: unsafe permissions on homedir '/tmp/tmp.nUmxfwbwfK/gnupg'
gpg: assuming signed data in 'python_gnupg-0.4.6-py2.py3-none-any.whl'
gpg: Signature made Sat 29 Aug 2020 10:04:03 PM +0545
gpg:                using RSA key 2DA3BAD0DB41087CA7E5E4C1F93C17B957F73F5A
gpg: Good signature from "Mallory <[email protected]>" [unknown]
gpg: Signature made Fri 17 Apr 2020 07:54:23 PM +0545
gpg:                using RSA key 9147B477339A9B86
gpg: BAD signature from "Vinay Sajip (CODE SIGNING KEY) <[email protected]>" [unknown]
user@disp2952:/tmp/tmp.nUmxfwbwfK$ echo $?
1
user@disp2952:/tmp/tmp.nUmxfwbwfK$ 

답변1

사용gpgv:

gpgv --homedir "${tmpDir}/gnupg" --keyring "${tmpDir}/gnupg/pubring.kbx" python_gnupg-0.4.6-py2.py3-none-any.whl.asc python_gnupg-0.4.6-py2.py3-none-any.whl

주어진 키링의 키를 사용하여 모든 서명이 검증된 경우에만 성공(종료 코드 0)을 표시합니다.

가져온 키가 요청한 지문과 일치하는지 확인하려면 gpg지문과 일치하는 키링의 키 목록을 요청할 수 있습니다.

gpg --homedir "${tmpDir}/gnupg" --no-default-keyring --keyring "${tmpDir}/gnupg/pubring.kbx" --list-keys "${ONLY_TRUST_THIS_FINGERPRINT}"

키링에 키가 있으면 성공하고, 그렇지 않으면 실패합니다.

신뢰 확인을 개선하려면 다운로드한 키를 실제로 저장하고 매번 키를 다시 다운로드하는 대신 항상 저장된 키를 사용하여 다운로드를 인증해야 합니다. 이것은 새로운 업스트림 버전을 확인하기 위해 일부 배포판(특히 Debian)에서 사용되는 방법입니다. 알려진 양호한 키는 패키지 소스(업스트림이 아닌 데비안에 있음)에 저장되며 새 버전은 Know a에 의해 설치된 경우에만 사용할 수 있습니다. 좋은 열쇠.

관련 정보