사용자 상호 작용없이 gpg 키를 생성하는 방법


13

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

답변:


4

엔트로피가 부족할 수 있습니다. 키 생성에는 많은 고품질 난수가 필요합니다. 컴퓨터에 고품질의 무작위성을 제공하는 사용자의 활동이 없으면 엔트로피 풀은 생성에 의해 소진되고 생성 프로세스가 중단되어 풀이 다시 채워지기를 기다립니다.

만족도를 높이기 위해 당신의 선택은

  1. 가장 현명하지 않은 비 차단 의사 난수 생성기를 사용하도록 gpg 재구성 (아래 참조)

  2. 기존 시스템 상태에서 더 많은 엔트로피를 도출하기 위해 소프트웨어 솔루션 사용 (커널은 시스템 상태, 특히 해당 상태에 직접적인 사람 입력이없는 경우 (예 : CPU 또는 NIC 타이밍) 시스템에서 파생되는 엔트로피의 양에 대해 매우 보수적 임); 당신이 지적했듯이, hasged 는 그러한 해결책 중 하나입니다.

  3. 컴퓨터에 다른 고급 엔트로피 소스를 제공합니다. 엔트로피 키 또는 OneRNG 와 같은 장치는 이 요구 사항을 충족시킬 수 있습니다 (엔트로피 키를 소유하고 있다는 제품 저장과 관련이 없으며 매우 만족합니다).

편집 : mzhaase는 / dev / urandom vs. / dev / random에 대한 이 기사에 대한 의견에서 관심을 끌고 있습니다 (많은 덕분에 훌륭한 기사입니다!) urandom. 실제로이 기사는 두 가지 출처가 동일하다고 말하지 않으며

리눅스의 / dev / urandom은 커널이 엔트로피를 모을 수있는 기회를 갖기 전에 행복하지 않은 숫자를 제공합니다. 언제입니까? 시스템 시작시 컴퓨터를 부팅합니다.

즉, 부팅 후 urandomPRNG가 충분한 엔트로피로 초기화 될 때까지 키 생성에 사용하는 것은 실제로 안전하지 않습니다. 특히 무인 헤드리스 서버에서 시간이 걸릴 수 있으며 시스템이 명시 적으로 알려주지 않기 때문에 임계 값에 도달 한 시점을 알 수 없습니다.

이제 /dev/random숫자를 발행 할 준비가 되었다면 엔트로피 풀이 충분히 깊어 urandom제대로 초기화 될 수 있다고 합리적으로 추론 할 수 있습니다 . 그러나 /dev/random매번 사용하기 전에 블로킹 을 확인 해야하는 경우 urandom(재부팅보다 키를 덜 생성하는 경우가 많을 가능성이 높습니다) 숫자를 사용하여 /dev/random키를 생성 할 수도 있습니다 .


2
그게 문제였습니다. 단호한 데몬을 추가했으며 이제 ~ 0.7s의 키 생성이 정상적으로 작동합니다.
eijeze

PRNG가 '좋지 않다'는 것은 신화입니다. 실제로 / dev / random과 / dev / urandom은 동일한 PRNG를 사용합니다. 계산적으로 안전한 알고리즘에 대해서는 실제 무작위성이 필요하지 않습니다 (그리고 / dev / random이나 / dev / urandom도 실제로 실제 무작위성을 제공 할 수는 없습니다 : 실제로 임의의 것을 측정해야 함). 진정한 임의성을 요구하는 유일한 암호화는 일회용 패드와 같은 정보 보안 알고리즘입니다. 이 링크는 이것에 대해 자세히 이야기합니다 : 2uo.de/myths-about-urandom
mzhaase

이상하게도 @mzhaase, 나는 그 링크를 건너서 이번 주 초에 그것을 읽었습니다. 나는 전적으로 동의하지 않지만 기사를 반영하기 위해 위의 답변을 편집 할 것입니다. 또한 퀀텀 터널링을 사용하여 서버에 물리적으로 연결된 엔트로피를 생성하는 하드웨어 장치가 있기 때문에 내 시스템은 이상하게도 실제로 임의의 확률을 얻습니다 /dev/random(따라서 /dev/urandom거의 항상 예측할 수없는 숫자 ). 위).
MadHatter

1
피난처가 잘 작동하면 1 초 안에 키가 생성됩니다. 그냥 apt-get을 haveged 한 다음 실행 설치 : haveged
waza123

@ waza123 좋은 지적이지만, 이미 2 년 전에 eijeze가 만든 것입니다 (위의 첫 번째 의견을보십시오).
MadHatter

2

스크립트를 작동시키는 몇 가지 간단한 변경 사항이 있습니다. 또한 키가 생성되면 자동으로 테스트되도록 몇 가지 테스트를 포함 시켰습니다.

또한 주요 테스트를 자동화 할 수 있도록 비밀번호를 제거했습니다.

#!/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

1

자동화 된 응용 프로그램 설치를위한 키 생성의 일부로이 문제를 해결했습니다. enrg 를 생성 하기 위해 ' rngd '패키지를 설치하고 시작하면 문제가 해결됩니다. 설치 및 사용이 간편합니다.

코드는 다음과 같습니다 .

  • /dev/hwrandom엔트로피 소스를 제공하기 위해 rngd ( 기본적으로 수정 가능)를 시작합니다.
  • 간단한 템플릿을 복사합니다 (jinja 템플릿 이메일과 이름을 원하는 것으로 바꿉니다)
  • gpg를 사용하여 키를 생성합니다
  • 로컬 키링으로 가져옵니다.

제공된 샘플 코드 urandom에서 소스로 사용되며 권장하지 않습니다. wiki.archlinux.org/index.php/Rng-tools Warning: Some tutorials available in the Internet, and even early versions of rng-tools package, recommend the following line for systems without TRGN: RNGD_OPTS="-o /dev/random -r /dev/urandom" Of course, this is a really bad idea, since you are simple filling the kernel entropy pool with entropy coming from the kernel itself! If your system does not have an available TRGN consider using haveged instead. See FS#34580 for details.
keyneom

@keyneom rngd는 /dev/hwrandom기본적으로 사용 하며 수정할 수 있습니다. 매뉴얼 페이지를 참조하십시오.
xddsg

urandom그렇습니다. 링크 된 코드에서 명시 적으로 사용 하고 있으며 그렇게하지 않는 것이 좋습니다.
keyneom

-1

다음은 사용할 수 있지만 현재 터미널에 영향을 미치지 않도록 새 터미널에서이 스크립트를 실행하는 것이 좋습니다. 이 스크립트는 사용자가 스크립트를 종료 할 때까지 머신을 사용 중 상태로 유지하고 무한 루프에 빠지도록하여 엔트로피를 계속 생성합니다. 키 생성 이후까지 사용자 상호 작용이 필요하지 않습니다. 모든 스크립트는 파일을 영원히 나열하는 것입니다.

컴퓨터와 키의 크기에 따라 생성하는 데 몇 분 (때로는 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

파일 시스템에서 찾기를 수행하는 것은 동작이 예측 가능하고 재현 가능하므로 실제로 안전한 엔트로피 소스를 생성하지 않습니다.
Joffrey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.