我尝试按照 GitLab 说明在MX 21.1 Wildflower
(基于 Debian 11,代号为 bullseye)Virtual Box VM(主机 Windows 10)上使用通用 GPG 密钥。
我决定按照指示使用 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.
它似乎卡在了生成熵的步骤上。尽管这些步骤已经过时,而且该工具只是伪随机的,但我还是尝试了以下方法来创建熵:
问题是,我试图让它运行几个小时,远远超过了我预计生成所需的时间,但它仍然卡住了。
在我终止该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/random
在cat /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
答案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 将提供任意数量的数据而不会阻塞。