如何在没有用户交互的情况下生成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

Answers:


4

您可能已经用尽了熵。密钥生成需要大量非常高质量的随机数。在没有用户向计算机提供高质量随机性的活动的情况下,熵池已被生成耗尽,并且生成过程刚刚挂起,等待池重新填充。

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

  1. 重新配置gpg以使用非阻塞的伪随机数生成器,这是最不明智的做法(尽管请参见下文),

  2. 使用软件解决方案从现有的系统状态中获取更多的熵(众所周知,内核对于准备从系统状态中获取多少熵是保守的,特别是在该状态没有直接人工输入的情况下,例如CPU或NIC时序);正如您所指出的那样,避险是一种解决方案,或者

  3. 为计算机提供了高级熵的另一个物理来源。诸如熵密钥OneRNG之类的设备可以满足此要求(除我拥有熵密钥之外,我与这两种产品都没有关系,并且对此感到非常满意)。

编辑:mzhaase在对/ dev / urandom与/ dev / random的这篇文章的评论中引起了我的注意(为此,非常感谢,这是一篇非常出色的文章!),并引起了我不喜欢使用urandom创建键的问题。实际上,本文并未说这两个来源是等效的,并指出

在内核甚至没有机会收集熵之前,Linux的/ dev / urandom会很高兴为您提供不太随机的数字。那是什么时候 在系统启动时,启动计算机。

也就是说,启动后,直到urandomPRNG被初始化为具有足够的熵之前,使用它进行密钥生成确实是不安全的。这可能需要一段时间,尤其是在无人值守的无头服务器上,并且我们不知道何时达到阈值,因为系统没有明确告诉我们。

现在,如果/dev/random准备发布数字,我可以合理地推断出熵池足够深,urandom可以正确初始化。但是,如果我必须/dev/random在每次使用前检查是否存在阻塞urandom(考虑到我生成密钥的频率比重新启动的频率要低,这很可能是事实),那么我也可以仅使用from中的数字/dev/random来生成密钥。


2
那是/是问题。添加了hadged守护程序,现在可以正常工作-在约0.7s内生成密钥。
eijeze 2015年

PRNG效果不佳是一个神话。实际上,/ dev / random和/ dev / urandom都使用相同的PRNG。对于只具有计算安全性的算法,您不需要真正的随机性(并且/ dev / random和/ dev / urandom都不能真正为您提供真正的随机性:您实际上需要为此测量随机性)。唯一需要真正随机性的密码学是信息安全算法,例如一次性密码。该链接详细讨论了这一点:2uo.de/myths-about-urandom
mzhaase

@mzhaase很奇怪,我在本周早些时候遇到了该链接,并阅读了该链接。我将在上面编辑我的答案以反映该文章,尽管我并不完全同意。我还注意到,奇怪的是,我的系统可能确实从获得了真正的随机性/dev/random(因此,/dev/urandom几乎一直都得到了高度不可预测的数字),因为我有一个硬件设备,该设备使用量子隧道生成物理附着到服务器上的熵(请参阅以上)。
MadHatter

1
Haveged效果很好,密钥在1秒内生成。只需apt-get install Haveged,然后运行:Haveged
waza123 '17

@ waza123很好,尽管可以说是两年前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

解决此问题,作为生成用于自动应用程序安装的密钥的一部分。安装并启动' rngd '软件包以生成entroy将解决您的问题。易于安装和使用。

这是代码

  • 启动rngd(/dev/hwrandom默认但可修改)以提供熵源
  • 复制一个简单的模板(用您想要的名称替换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

在文件系统上进行查找并不能产生真正安全的熵源,因为它的行为是可预测和可再现的。
乔佛里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.