shell – 如何在没有用户交互的情况下生成gpg密钥?

我发现在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文件在home dir中生成,但是为空.

我错过了什么?如何在没有任何用户交互的情况下生成密钥?

版本:

> gpg(GnuPG)2.0.26
> libgcrypt 1.6.2

最佳答案
你可能已经没有熵了.密钥生成需要大量非常高质量的随机数;如果没有用户的活动来向计算机提供高质量的随机性,则熵池正在被生成耗尽,并且生成过程只是挂起,等待池重新填充.

你的选择,为了提高满意度,是

>重新配置gpg以使用非阻塞伪随机数生成器,这是最不明智的(尽管见下文),
>使用软件解决方案从现有系统状态中获取更多熵(众所周知,核心准备从系统状态中获取多少熵,特别是在该状态没有直接人工输入的情况下,例如CPU或NIC时序);正如你所指出的,haveged是一个这样的解决方案,或者
>为计算机提供另一种高级熵的物理来源.像Entropy Keythe OneRNG这样的设备可以满足这个要求(除了我拥有一个熵密钥之外,我与这两个产品都没有关系,我对它非常满意).

编辑:mzhaase在this article on /dev/urandom vs. /dev/random的评论中引起了我的注意(非常感谢,这是一篇很棒的文章!)并且我不喜欢使用urandom来创建密钥.事实上,文章并没有说这两个来源是等价的,并指出

Linux’s /dev/urandom happily gives you not-so-random numbers before
the kernel even had the chance to gather entropy. When is that? At
system start, booting the computer.

也就是说,在启动之后,直到urandom PRNG已经用足够的熵初始化,将它用于密钥生成真的是不安全的.这可能需要一段时间,尤其是在无人值守的无头服务器上,我们不知道何时达到阈值,因为系统没有明确告诉我们.

现在,如果/ dev / random准备发出数字,我可以合理推断熵池足够深,以至于urandom将被正确初始化.但是如果我必须在每次使用urandom之前检查/ dev / random阻塞(假设我生成密钥的次数少于我重启的情况,很可能就是这种情况)我不妨只使用/ dev / random中的数字生成我的密钥.

转载注明原文:shell – 如何在没有用户交互的情况下生成gpg密钥? - 代码日志