https://www.gnupg.org/documentation/manuals/gnupg/Unattended-GPG-key-generation.html#Unattended-GPG-key-generation 방법에서 사용자 상호 작용없이 gpg 키를 생성하는 방법을 찾았 지만 그렇지 않습니다. 작동하는 것 같습니다.
내 스크립트는 다음과 같습니다
#!/usr/bin/env bash
rm -rf .gnupg
mkdir -m 0700 .gnupg
touch .gnupg/gpg.conf
chmod 600 .gnupg/gpg.conf
tail -n +4 /usr/share/gnupg2/gpg-conf.skel > .gnupg/gpg.conf
touch .gnupg/{pub,sec}ring.gpg
cat >.gnupg/foo <<EOF
%echo Generating a basic OpenPGP key
Key-Type: RSA
Key-Length: 2048
Subkey-Type: RSA
Subkey-Length: 2048
Name-Real: User 1
Name-Comment: User 1
Name-Email: user@1.com
Expire-Date: 0
Passphrase: kljfhslfjkhsaljkhsdflgjkhsd
%pubring foo.pub
%secring foo.sec
# Do a commit here, so that we can later print "done" :-)
%commit
%echo done
EOF
gpg2 --verbose --batch --gen-key .gnupg/foo
내가 실행하면 다음과 같이 표시됩니다.
=$ ./gen.keys.sh
gpg: Generating a basic OpenPGP key
gpg: no running gpg-agent - starting one
gpg: writing public key to `foo.pub'
gpg: writing secret key to `foo.sec'
그러나 그냥 멈 춥니 다.
그 동안이 사용자의 ps 트리를 확인하면 다음을 볼 수 있습니다.
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
tstpg 22603 0.0 0.0 24108 5688 pts/9 Ss 14:59 0:00 -bash
tstpg 22624 0.0 0.0 13688 3168 pts/9 S+ 14:59 0:00 \_ bash ./gen.keys.sh
tstpg 22632 0.2 0.0 27428 3676 pts/9 SL+ 14:59 0:00 \_ gpg2 --verbose --batch --gen-key .gnupg/foo
tstpg 22634 0.3 0.0 18072 2884 pts/9 SL+ 14:59 0:00 \_ gpg-agent --server
~ / .gnupg / gpg.conf에는 에이전트에 대한 언급이 없으며 에이전트가 무엇을 하려는지 전혀 모릅니다.
foo.pub/foo.sec 파일은 홈 디렉토리에 생성되지만 비어 있습니다.
내가 무엇을 놓치고 있습니까? 어떤 종류의 사용자 상호 작용없이 키를 생성하는 방법?
버전 :
- gpg (GnuPG) 2.0.26
- libgcrypt 1.6.2
답변
엔트로피가 부족할 수 있습니다. 키 생성에는 많은 고품질 난수가 필요합니다. 컴퓨터에 고품질의 무작위성을 제공하는 사용자의 활동이 없으면 엔트로피 풀은 생성에 의해 소진되고 생성 프로세스가 중단되어 풀이 다시 채워지기를 기다립니다.
만족도를 높이기 위해 당신의 선택은
-
가장 현명하지 않은 비 차단 의사 난수 생성기를 사용하도록 gpg 재구성 (아래 참조)
-
기존 시스템 상태에서 더 많은 엔트로피를 도출하기 위해 소프트웨어 솔루션 사용 (커널은 시스템 상태, 특히 해당 상태에 직접적인 사람 입력이없는 경우 (예 : CPU 또는 NIC 타이밍) 시스템에서 파생되는 엔트로피의 양에 대해 매우 보수적 임); 당신이 지적했듯이, hasged 는 그러한 해결책 중 하나입니다.
-
컴퓨터에 다른 고급 엔트로피 소스를 제공합니다. 엔트로피 키 또는 OneRNG 와 같은 장치는 이 요구 사항을 충족시킬 수 있습니다 (엔트로피 키를 소유하고 있다는 제품 저장과 관련이 없으며 매우 만족합니다).
편집 : mzhaase는 / dev / urandom vs. / dev / random에 대한 이 기사에 대한 의견에서 관심을 끌고 있습니다 (많은 덕분에 훌륭한 기사입니다!) urandom
. 실제로이 기사는 두 가지 출처가 동일하다고 말하지 않으며
리눅스의 / dev / urandom은 커널이 엔트로피를 모을 수있는 기회를 갖기 전에 행복하지 않은 숫자를 제공합니다. 언제입니까? 시스템 시작시 컴퓨터를 부팅합니다.
즉, 부팅 후 urandom
PRNG가 충분한 엔트로피로 초기화 될 때까지 키 생성에 사용하는 것은 실제로 안전하지 않습니다. 특히 무인 헤드리스 서버에서 시간이 걸릴 수 있으며 시스템이 명시 적으로 알려주지 않기 때문에 임계 값에 도달 한 시점을 알 수 없습니다.
이제 /dev/random
숫자를 발행 할 준비가 되었다면 엔트로피 풀이 충분히 깊어 urandom
제대로 초기화 될 수 있다고 합리적으로 추론 할 수 있습니다 . 그러나 /dev/random
매번 사용하기 전에 블로킹 을 확인 해야하는 경우 urandom
(재부팅보다 키를 덜 생성하는 경우가 많을 가능성이 높습니다) 숫자를 사용하여 /dev/random
키를 생성 할 수도 있습니다 .
답변
스크립트를 작동시키는 몇 가지 간단한 변경 사항이 있습니다. 또한 키가 생성되면 자동으로 테스트되도록 몇 가지 테스트를 포함 시켰습니다.
또한 주요 테스트를 자동화 할 수 있도록 비밀번호를 제거했습니다.
#!/usr/bin/env bash
rm -rf .gnupg
mkdir -m 0700 .gnupg
touch .gnupg/gpg.conf
chmod 600 .gnupg/gpg.conf
tail -n +4 /usr/share/gnupg2/gpg-conf.skel > .gnupg/gpg.conf
cd .gnupg
# I removed this line since these are created if a list key is done.
# touch .gnupg/{pub,sec}ring.gpg
gpg2 --list-keys
cat >keydetails <<EOF
%echo Generating a basic OpenPGP key
Key-Type: RSA
Key-Length: 2048
Subkey-Type: RSA
Subkey-Length: 2048
Name-Real: User 1
Name-Comment: User 1
Name-Email: user@1.com
Expire-Date: 0
%no-ask-passphrase
%no-protection
%pubring pubring.kbx
%secring trustdb.gpg
# Do a commit here, so that we can later print "done" :-)
%commit
%echo done
EOF
gpg2 --verbose --batch --gen-key keydetails
# Set trust to 5 for the key so we can encrypt without prompt.
echo -e "5\ny\n" | gpg2 --command-fd 0 --expert --edit-key user@1.com trust;
# Test that the key was created and the permission the trust was set.
gpg2 --list-keys
# Test the key can encrypt and decrypt.
gpg2 -e -a -r user@1.com keydetails
# Delete the options and decrypt the original to stdout.
rm keydetails
gpg2 -d keydetails.asc
rm keydetails.asc
답변
자동화 된 응용 프로그램 설치를위한 키 생성의 일부로이 문제를 해결했습니다. enrg 를 생성 하기 위해 ‘ rngd ‘패키지를 설치하고 시작하면 문제가 해결됩니다. 설치 및 사용이 간편합니다.
/dev/hwrandom
엔트로피 소스를 제공하기 위해 rngd ( 기본적으로 수정 가능)를 시작합니다.- 간단한 템플릿을 복사합니다 (jinja 템플릿 이메일과 이름을 원하는 것으로 바꿉니다)
- gpg를 사용하여 키를 생성합니다
- 로컬 키링으로 가져옵니다.
답변
다음은 사용할 수 있지만 현재 터미널에 영향을 미치지 않도록 새 터미널에서이 스크립트를 실행하는 것이 좋습니다. 이 스크립트는 사용자가 스크립트를 종료 할 때까지 머신을 사용 중 상태로 유지하고 무한 루프에 빠지도록하여 엔트로피를 계속 생성합니다. 키 생성 이후까지 사용자 상호 작용이 필요하지 않습니다. 모든 스크립트는 파일을 영원히 나열하는 것입니다.
컴퓨터와 키의 크기에 따라 생성하는 데 몇 분 (때로는 10+)이 걸릴 수 있지만 상호 작용할 필요는 없습니다.
#!/bin/sh
while true;
do find * / && find * / && find * / && find * / && find * / && find * / && find * / && find * / && find * /;
echo "Press ctrl+c to exit this infinite loop"
sleep 2;
done