저는 Fedora 25(F25) 워크스테이션(KDE 스핀)에서 작업하고 있습니다. 자동화된 테스트를 수행하기 위해 몇 가지 스크립트를 작성 중입니다.
자동화된 테스트 중 하나에는 RPMSIGN(8) 프로그램 호출이 포함되었으며, 이 프로그램은 GPG(1)를 호출하여 내가 만들고 있는 일부 RPM 파일에 디지털 서명을 추가했습니다. 물론 GPG는 pinentry(PIN 입력)를 사용하여 사용자에게 RPM 서명 키(RSA 키 쌍)에 대한 비밀번호를 묻는 메시지를 표시합니다. 저는 인간을 루프에서 벗어나 RPM 서명 키에 대한 비밀번호 제공 작업을 완전히 자동화하고 싶습니다. (예, 보안에 미치는 영향을 알고 있습니다. 이것은 프로덕션 호스트가 아닌 자동화된 테스트 환경일 뿐이므로 보안에 대해서는 크게 걱정하지 않습니다. 프로덕션 빌드에서는 사용자가 RPM 서명 키의 비밀번호를 수동으로 입력합니다. .)
과거에는 EXPECT(1) 스크립트를 사용하여 GPG가 "Enter passphrase:"라는 텍스트를 콘솔에 출력할 때까지 기다렸다가 계속하기 전에 EXPECT 스크립트가 암호를 입력했습니다. 좋은 결과.
F25에서 pinentry 기능은 RPM 서명 키에 대한 비밀번호를 자동으로 입력하는 기존 EXPECT 기반 솔루션을 깨뜨립니다.
이 F25 호스트의 GUI 콘솔 창에서 RPMSIGN을 실행하면 GPG는 pinentry를 사용하여 사용자(나)에게 RPM 서명 키에 대한 비밀번호를 입력하도록 요청하는 GUI 대화 상자를 표시합니다. 물론, 이 비밀번호 입력 동작은 비밀번호 문구의 자동 입력을 방해하고 방지합니다.
DISPLAY 환경 변수를 일시적으로 설정 해제하는 Bash 스크립트를 생성하면 더 이상 GUI 대화 상자가 표시되지 않습니다.
#!/bin/bash
DISPLAY_SAVE=$DISPLAY
unset DISPLAY
rpmsign --resign "/path/to/test-1.0.0-1.fc25.noarch.rpm"
export DISPLAY=$DISPLAY_SAVE
하지만 이제 콘솔에 이 대화 상자의 ncurses 버전이 표시됩니다.
+----------------------------------------------------------------+
| Please enter the passphrase to unlock the OpenPGP secret key: |
| "Testing (rpm-sign)" |
| 1024-bit RSA key, ID 0123456789ABCDEF, |
| created 2016-12-02. |
| |
| |
| Passphrase: __________________________________________________ |
| |
| <OK> <Cancel> |
+----------------------------------------------------------------+
마찬가지로 pinentry-curses의 콘솔 "대화 상자"는 자동 비밀번호 입력을 방해하고 방지합니다.
pinentry 모듈을 영구적으로 수정하거나 비활성화하고 싶지는 않습니다. 단지 pinentry의 간섭 없이 GPG의 CLI 프롬프트 "Enter Password:"(또는 현재 프롬프트 문자열)를 반환하기 위해 일시적으로 비활성화하고 싶습니다.
Pinentry 간섭 없이 CLI를 통해 RPM 서명 키의 암호 입력을 완전히 자동화하기 위한 제안 사항이 있습니까?
답변1
이 gpg-preset-passphrase
유틸리티를 알려준 @Joe Damato에게 감사드립니다. 아래 설명된 솔루션은 설치된 Fedora 25 호스트에서 개발 및 테스트되었습니다 gnupg2-2.1.x
.
(참고로 이전 버전의 GnuPG를 실행하는 플랫폼에서는 해당 옵션을 지원하지 않기 때문에 RPM 서명 키의 키그립 값을 결정하는 방법을 아직 파악하지 못했습니다 --with-keygrip
. 누구든지 이 솔루션에 대해 의견을 제시하고 싶다면 그렇게 하십시오. )
~/.gnupg/gpg-agent.conf
이 줄을 포함 해야 합니다 .
allow-preset-passphrase
수정 후 ~/.gnupg/gpg-agent.conf
gpg-agent를 다시 로드합니다 .
$ gpg-connect-agent reloadagent /bye
OK
RPM 서명 키의 8개의 16진수 키 ID를 얻으려면 GPG 키를 나열하세요. 이 예에서 키 ID는 입니다 0123ABCD
.
$ gpg --list-keys
/home/me/.gnupg/pubring.gpg
-----------------------------------
pub 1024R/0123ABCD 2015-06-13
uid Test (rpm-sign)
RPM 서명 키를 얻기 위한 키그립 코드입니다. (테스트에 사용한 RHEL 7.2 및 Fedora 20 호스트에서는 GPG2(1)
해당 호스트의 프로그램이 이 옵션을 인식하지 못했습니다 --with-keygrip
.)
$ gpg2 --with-keygrip -K 0123ABCD
sec rsa1024 2015-06-13 [SCEA]
0A1B2C3D4E5F6A7B8C9D0E0F1A2B3C4D0123ABCD
Keygrip = 2EACA0C5A4B46168EB91970B6715AF1AA52968BE
uid [ unknown] Test (rpm-sign)
RPM 서명 키를 캐싱하기 위한 비밀번호입니다. 아래 표시된 명령줄에서 'PASSPHRASE'
RPM 서명 키를 실제 비밀번호로 대체하세요.
$ /usr/libexec/gpg-preset-passphrase --passphrase 'PASSPHRASE' --preset 2EACA0C5A4B46168EB91970B6715AF1AA52968BE
:: 시험::
서명되지 않은 테스트 RPM 파일을 만듭니다. 테스트 RPM 파일이 서명되지 않았는지 확인하십시오.
$ rpm --checksig test-1.0.0-1.f25.noarch.rpm
test-1.0.0-1.fc25.noarch.rpm: sha1 md5 OK
테스트 RPM 파일에 서명할 때 RPMSIGN(8)
캐시된 비밀번호가 사용되는지 확인하십시오(즉, RPMSIGN(8)
RPM 서명 키의 비밀번호를 묻는 메시지가 표시되지 않습니다).
$ rpmsign --resign test-1.0.0-1.f25.noarch.rpm
테스트 RPM 파일이 서명되었는지 확인하십시오.
$ rpm --checksig test-1.0.0-1.f25.noarch.rpm
test-1.0.0-1.fc25.noarch.rpm: rsa sha1 (md5) pgp md5 OK
:: 부록 1 (2016-12-17) ::
이에 따르면GnuPG 문제 2331 웹페이지:
gpg1은 키그립에 대해 모릅니다. gpg1은 키그립 대신 지문을 gpg-agent의 캐시 ID로 사용합니다. gpg1에서 사용하는 프록시 명령 GET_PASSPHRAE는 gpg-preset-passphrases에서 사용하는 것과 다른 캐싱 모드를 사용합니다. 그래서 열쇠손잡이를 (서브)키의 지문으로 교체하더라도 작동하지 않습니다.
어쨌든 RHEL7 호스트에서 GnuPG 버전 2.0.x를 사용하여 몇 가지 테스트를 수행했지만 gpg-preset-passphrase
지원되지 않는 것 같습니다. gpg-preset-passphrase
GnuPG 버전 2.1.x 만 사용할 수 있습니다 .
인용하다
답변2
%__gpg_sign_cmd
파일에 매크로를 추가/수정하여 .rpmmacros
gpg에게 파일에서 비밀번호를 읽도록 지시할 수 있습니다 . rpm --showrc
지금 무슨 일이 일어나고 있는지 보려면 사용하여 파일에 %__gpg_sign_cmd
넣고 다음을 추가하십시오..rpmmacros
--batch --pinentry-mode loopback --passphrase-file /path/to/passphrase-file
\
값 행이 여러 개인 경우 마지막 행을 제외한 모든 행이 로 끝나는지 확인하세요.
이렇게 하면 gpg가 어떤 방식으로든 비밀번호를 묻는 메시지를 표시하지 않고 정의된 파일에서 비밀번호를 읽게 됩니다. 이는 다음을 구성합니다.보안 위험물론, 이것이 당신이 원하는 것인지 고려하고 이를 확보하기 위해 필요한 조치(소유권 및 라이선스 등)를 취하시기 바랍니다.
완전한 %__gpg_sign_cmd
예 .rpmmacros
:
%__gpg_sign_cmd %{__gpg} \
gpg --no-verbose --no-armor --batch --pinentry-mode loopback \
--passphrase-file /path/to/passphrase-file \
%{?_gpg_digest_algo:--digest-algo %{_gpg_digest_algo}} \
--no-secmem-warning \
-u "%{_gpg_name}" -sbo %{__signature_filename} %{__plaintext_filename}
패키지에 서명하십시오.
$ rpm --checksig somepackage.rpm
somepackage.rpm: sha1 md5 OK
$ rpmsign --addsign somepackage.rpm
somepackage.rpm:
$ rpm --checksig somepackage.rpm
somepackage.rpm: rsa sha1 (md5) pgp md5 OK
답변3
이러한 문제를 해결하는 한 가지 방법은 gpg-agent
GPG에서 관리하는 GPG 키를 사용하는 것입니다. 캐시에 gpg-preset-passphrase
암호 문구를 시드하는 것과 함께 이 도구를 사용할 수 있습니다 . gpg-agent
gpg-agent에 대해 자세히 읽어보세요.여기. 이렇게 하면 자동화된 작업을 수행하기 위해 수동으로 비밀번호를 입력할 필요가 없습니다.
그건 그렇고, 나는 유용한 블로그 게시물을 썼습니다GPG는 RPM 패키지 및 YUM 저장소에 서명하고 확인합니다.유용하다고 생각할 수도 있습니다.
답변4
GPG 2.0이 설치된 CentOS7(RedHat7인 것 같습니다)의 경우 pinentry-mode
작동하지 않습니다 gpg-preset-passphrase
.
나는 그것을 사용하여 작동하게 만들었습니다.예상되는.
#!/usr/bin/expect -f
### rpm-sign.exp -- Sign RPMs by sending the passphrase.
spawn rpm --addsign {*}$argv
expect -exact "Enter pass phrase: "
send -- "Secret passphrase\r"
expect eof
## end of rpm-sign.exp
용법
$ ./rpm-sign.exp PACKAGE-FILE
Aaron S. Hawley 제공GPG 서명 RPM 무인