未经监管的GPG命令脚本在执行GPG命令时出现挂起。

5
我想为一个使用Ubuntu操作系统的人创建一个自动化GnuPG密钥生成脚本,这个人不喜欢使用命令行界面。此外,有其他人管理他们的电脑,保持其更新和良好运行状态,所以他们没有root / sudo访问权限。我真的很想尽可能避免通过电话指导的方式进行操作...因为这样做太麻烦了!因此,我从gnupg.org论坛上找到的示例中借鉴了很多内容编写了这个脚本。但是,无论在3或4分钟内产生多少鼠标活动,一旦运行gpg --gen-key --batch命令,该脚本似乎都无法执行任何操作。顺便说一下,所有的echo语句只是暂时用于指示脚本的进度,目前进展不是很大。
#!/bin/bash

# First run give your server some work, otherwise gpg won't be able to generator random bytes.
#sudo rngd -r /dev/urandom
#no sudo so:
echo -e "\nYou need to begin moving your mouse continuously and in random patterns for as long as it takes to generate a new key. This could take a minute or two, so be patient and just keep moving the mouse.\n"

echo -e "\ngpg --gen-key --batch\n"
gpg --batch --gen-key

%echo Generating a default key
Key-Type: default
Key-Length: 2048
Subkey-Type: default
Name-Real: Firstname Lastname
Name-Comment: No comment
Name-Email: user@domain.com
Expire-Date: 0
Passphrase: abcde
%pubring foo.pub
%secring foo.sec
# Do a commit here, so that we can later print "done" :-)
%commit
%echo done

# kill the rngd task.
#sudo service rng-tools stop


echo -e "\ngpg -k\n"
gpg -k

# get key id for newly created passkey
echo -e "\nkId=$(gpg -k Firstname|grep pub|sed -r 's/^pub[ ]*2048R\/([A-Z0-9]{8,})[ ]*.*$/\1/')\n" #; echo "\$kId: ${kId}"
kId=$(gpg -k Firstname|grep pub|sed -r 's/^pub[ ]*2048R\/([A-Z0-9]{8,})[ ]*.*$/\1/') ; echo -e "\n\$kId: ${kId}\n"

# set key as the default key (if desired) by entering this line in your ~/.bashrc
echo -e "\nexport GPGKEY=$kId\n"
export GPGKEY="$kId"

# restart the gpg-agent and source your .bashrc again
echo -e "\nkillall -q gpg-agent\n"
killall -q gpg-agent
eval $(gpg-agent --daemon)
source ~/.bashrc

#create revocation cert
echo -e "\ngpg --output revoke.asc --gen-revoke $GPGKEY\n"
gpg --output revoke.asc --gen-revoke $GPGKEY

# send public key to keyserver
echo -e "\ngpg --send-keys --keyserver keyserver.ubuntu.com $GPGKEY\n"
#gpg --send-keys --keyserver keyserver.ubuntu.com $GPGKEY

我想知道是否有人能够发现任何明显的问题或遗漏,以便传递'gpg'所需的密钥详细信息?

即使我使用sudo rngd -r /dev/random命令运行脚本以绕过预期用户的sudo访问权限,我仍然会得到相同的结果。

所以我猜问题出在我想要传递给gpg的密钥参数上,但是我已经在man页面中进行了交叉参考,似乎找不到问题所在。不过,有趣的是gpg没有返回错误信息。


GnuPG或您的脚本卡在哪里了?您可能需要使用%no-ask-passphrase。如果您没有足够的熵,请继续工作并让GnuPG在后台运行。大多数操作系统从多个来源派生熵,仅移动鼠标可能不足。做一些实际工作,以产生网络流量、硬盘旋转等活动,它很快就能收集足够的熵。无论如何:您使用的是哪个操作系统? - Jens Erat
@Jens:抱歉,脚本在回显和运行gpg --gen-key --batch之后挂起;我正在运行Debian稳定版;我还尝试让du /在运行脚本之前运行,这肯定会生成足够的熵,但也打开并关闭了像GIMP、Inkscape和VBox这样占用大量资源的应用程序。我将尝试添加%no-ask-passphrase选项,看看事情是否会进一步发展。 - nanker
@Jens 是的,%no-ask-passphrase 没有明显的影响。但奇怪的是,在 gpg --batch --gen-key 命令后面紧跟着的 %echo Generating a default key 从未回显,这可能表明 gpg --batch --gen-key 命令存在问题;但在我找到的几个处理无人值守 gpg 密钥生成的网站中,该命令似乎是被使用或建议使用的。但是为什么 gpg 不会返回错误呢,除非它确实在等待某些用户输入,这将使无人值守的“批处理”选项失效。 - nanker
很可能找到了问题,你的脚本现在不能正常工作。GnuPG 等待输入,但它从未收到后续的命令作为该输入。 - Jens Erat
请注意,使用“sudo rngd -r /dev/random”会导致不安全的密钥生成,请勿在任何重要场合使用! - Chris Jefferson
1个回答

5

通过批处理密钥生成,GnuPG期望在文件中包含创建指令,可以参考GnuPG的批处理密钥生成说明文档

cat <<EOT >batch-cmds
%echo Generating a default key
Key-Type: default
Key-Length: 2048
Subkey-Type: default
Name-Real: Firstname Lastname
Name-Comment: No comment
Name-Email: user@domain.com
Expire-Date: 0
Passphrase: abcde
%pubring foo.pub
%secring foo.sec
# Do a commit here, so that we can later print "done" :-)
%commit
%echo done
EOT
gpg --batch --gen-key batch-cmds

考虑将密码存储在硬盘文件中所带来的安全隐患。我不确定是否可以将内容直接管道传输到GnuPG而不是存储到文件中。可以尝试类似以下命令:

gpg --batch --gen-key <<EOT
%echo Generating a default key
Key-Type: default
Key-Length: 2048
Subkey-Type: default
Name-Real: Firstname Lastname
Name-Comment: No comment
Name-Email: user@domain.com
Expire-Date: 0
Passphrase: abcde
%pubring foo.pub
%secring foo.sec
# Do a commit here, so that we can later print "done" :-)
%commit
%echo done
EOT

分离文件和参数可以正常工作。但是无法在行内使用参数。 - nanker
这也没有在文档中描述,但是 GnuPG 似乎在等待某些东西。显然不是用于批量密钥生成输入。 - Jens Erat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接