我发现在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: [email protected] 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文件是在主目录中生成的,但是是空的。
我错过了什么? 如何在没有任何用户交互的情况下生成密钥?
版本:
你很可能已经没有了熵。 密钥生成需要很多非常高质量的随机数字; 没有用户的活动向计算机提供高质量的随机性,熵池正在被消耗,生成过程只是挂起,等待池的填充。
你的select,以令人满意的顺序,是
重新configurationgpg以使用非阻塞的伪随机数生成器, 这将是最不明智的 (尽pipe见下文)
使用软件解决scheme从现有的系统状态中获得更多的熵(内核非常保守,准备从系统状态获得多less熵,尤其是那些状态没有直接的人为input的情况下,例如CPU或NIC时序)。 正如你所指出的那样,这个解决scheme就是一个,或者说
为计算机提供另一个高级熵的物理来源。 像Entropy Key或OneRNG这样的设备可以满足这个要求(除了我拥有一个Entropy Key之外,我对这两个产品都没有任何联系,我对此非常满意)。
编辑 :mzhaase在这篇关于/ dev / urandom和/ dev / random的文章的评论中引起了我的注意,并且对我使用urandom创build密钥的反感感到不满。 实际上,这篇文章并没有说这两个来源是相同的,并且指出
Linux的/ dev / urandom在内核甚至有机会收集熵之前,高兴地给你一些不那么随机的数字。 那是什么时候? 在系统启动时,启动电脑。
也就是说,在启动之后,直到urandom PRNG已经被足够的熵初始化,使用它来进行密钥生成确实是不安全的。 这可能需要一段时间,特别是在无人看pipe的无人服务器上,而且我们不知道何时达到了阈值,因为系统没有明确地告诉我们。
现在,如果/dev/random准备发布数字,我可以合理地推断熵池足够深, urandom将被正确初始化。 但是如果我必须在每次使用urandom之前检查/dev/random进行阻塞(这是因为我不经常重新生成密钥,很可能是这种情况),我可能只是使用/dev/random生成我的密钥。
将其作为生成自动化应用程序安装密钥的一部分。 安装并启动' rngd '包来生成entroy将会解决你的问题。 简单的安装和使用。
这是代码 。
/dev/hwrandom ,但是可以修改)来提供一个熵源