生成密钥时 GPG 挂起

生成密钥时 GPG 挂起

我尝试按照 GitLab 说明在MX 21.1 Wildflower(基于 Debian 11,代号为 bullseye)Virtual Box VM(主机 Windows 10)上使用通用 GPG 密钥。

GitLab 说明

我决定按照指示使用 RSA 和 RSA、4096 位密钥。

gpg2 --full-gen-key --debug-all
gpg: reading options from '[cmdline]'
gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gpg: enabled debug flags: packet mpi crypto filter iobuf memory cache memstat trust hashing ipc clock lookup extprog
gpg: DBG: [not enabled in the source] start
gpg: directory '/home/myhome/.gnupg' created
gpg: DBG: fd_cache_invalidate (/home/myhome/.gnupg/pubring.kbx)
gpg: DBG: iobuf-1.0: open '/home/myhome/.gnupg/pubring.kbx' desc=file_filter(fd) fd=3
gpg: DBG: iobuf-1.0: close 'file_filter(fd)'
gpg: DBG: /home/myhome/.gnupg/pubring.kbx: close fd/handle 3
gpg: DBG: fd_cache_close (/home/myhome/.gnupg/pubring.kbx) new slot created
gpg: DBG: iobuf-*.*: ioctl '/home/myhome/.gnupg/pubring.kbx' invalidate
gpg: DBG: fd_cache_invalidate (/home/myhome/.gnupg/pubring.kbx)
gpg: DBG:                 did (/home/myhome/.gnupg/pubring.kbx)
gpg: keybox '/home/myhome/.gnupg/pubring.kbx' created
Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
  (14) Existing key from card
Your selection? 
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 
Key does not expire at all
Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

Real name: That Name
Email address: [email protected]
Comment: 
You selected this USER-ID:
    "That Name <[email protected]>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

它似乎卡在了生成熵的步骤上。尽管这些步骤已经过时,而且该工具只是伪随机的,但我还是尝试了以下方法来创建熵:

使用 RNGD 的 GPG 熵技术

问题是,我试图让它运行几个小时,远远超过了我预计生成所需的时间,但它仍然卡住了。

在我终止该gpg进程后,我运行以下命令来清除状态,然后再重试。

$ rm -rf ~/.gnupg/

问题是:我该如何调试这个过程?

我知道我可能只需使用我的主机 Windows 10 来生成密钥就可以解决这个问题,但我仍然想知道我的虚拟机中发生了什么,导致该过程无法完成。

对于诊断步骤,我确实尝试每隔几秒钟在另一个 shell 上重新运行以下命令:

cat /proc/sys/kernel/random/entropy_avail

似乎一直卡在256。还有什么建议我可以尝试吗?


编辑 1:我也尝试了以下操作: https://serverfault.com/questions/214605/gpg-does-not-have-enough-entropy https://serverfault.com/questions/471412/gpg-gen-key-hangs-at-gaining-enough-entropy-on-centos-6

我确实尝试输出堆栈,但它似乎卡在读取事件上,不确定它试图读取什么,因为我可以cat /dev/randomcat /dev/urandom不同的运行中尝试使用rngd,它似乎会继续输出随机字母/数字

$ sudo cat /proc/89785/stack 
[<0>] unix_stream_read_generic+0x58d/0x870
[<0>] unix_stream_recvmsg+0x53/0x70
[<0>] sock_read_iter+0x92/0xf0
[<0>] new_sync_read+0x18a/0x1a0
[<0>] vfs_read+0xf4/0x180
[<0>] ksys_read+0xa7/0xe0
[<0>] do_syscall_64+0x33/0x80
[<0>] entry_SYSCALL_64_after_hwframe+0x44/0xa9

我稍后会进行更深入的研究(特别是strace),但目前我在堆栈上看到的是这样的

答案1

熵的生成在虚拟机中始终是一个挑战,因为它基于来自环境的“随机输入”。然而,虚拟机的 I/O 全部由主机决定,并且只在绝对必要时才进行,因此熵较低。

如果你没有严格的安全要求,一个常见的解决方案是安装haveged。它使用伪随机HAVEGE算法向Linux内核注入更多熵。安装和使用非常简单:

apt-get install haveged
systemctl enable haveged
systemctl start haveged

有关 HAVEGE 算法的更多信息这里

答案2

我该如何调试该过程?

查看sudo cat /proc/PID/stack会显示该进程当前在内核中的哪个位置卡住了。该strace工具可用于查看进程进行了哪些内核调用,例如,它是忙于尝试从 /dev/random 读取数据,还是在等待 getrandom() 系统调用。

注意:GnuPG 2.1.x 及更高版本依赖 gpg-agent 来处理私钥,因此gpg您不应该检查其本身,而应该检查该gpg-agent进程正在做什么。

事实上,由于你启用了 'ipc' 调试标志,你应该看到 gpg 至少尝试与 gpg-agent 通信。用于gpg-connect-agent检查 gpg-agent 进程是否处于活动状态并有响应。(它应该在第一次连接到套接字时由 systemd 启动,否则由 gpg 本身生成。)

此外,由于 gpg-agent 可能试图显示图形“私钥密码”提示(用于保护新生成的密钥),因此该过程可能会卡住。有时您可能正在控制台或通过 SSH 工作,但 gpg-agent 可能仍认为您有可用的 X11,并且可能在与您正在查看的显示器不同的显示器上显示图形提示 - 尝试unset DISPLAY; gpg-connect-agent updatestartuptty /bye更新其环境。

似乎始终停留在 256。

这很正常。当前的 Linux 内核具有足够好的 CSPRNG,并且不再执行熵核算。一旦内核的 RNG 成功初始化(这本身应该会更快,因为 Linux 现在haveged默认使用类似方法),/dev/random 将提供任意数量的数据而不会阻塞。

相关内容