如何在Docker容器中使用GnuPG,因为它缺less熵?

我需要dockerize一个apt库。 其中的软件包需要进行签名,目前通过aptly publish snapshot -distribution="stable" -gpg-key="<key id>" my-snapshot

在此之前,需要使用gpg --gen-key创buildgpg --gen-key

但是这样一来,私钥将会在Docker镜像里面显示出来,这似乎不是一个好习惯。 此外,id甚至不工作; 运行gpg --gen-key --batch <gpg.in被卡住了:

 Not enough random bytes available. Please do some other work to give the OS a chance to collect more entropy! (Need 284 more bytes) 

我不知道是否可以在Docker容器中生成gpg密钥,即使它是,也不是一个好主意。

有没有办法通过外部密钥签署回购的内容?

缺less熵

Docker不提供虚拟/dev/[u]random设备。 如果容器中没有足够的熵,则主机上的熵不足。

检查/proc/sys/kernel/random/entropy_avail ,它们在Docker主机和容器上应该几乎相同(如果数量略有不同,它只是非常频繁地更改,否则重新检查几次)。

可能的原因:

  • 在虚拟机中运行boot2docker主机,例如由于boot2docker或自build的虚拟机。 只要确保在虚拟机中获得更多熵, havegd对开发人员havegd是一个非常简单的解决scheme,但可能不适合生产。
  • 另一个容器/应用程序正在使用所有的熵。 实现哪一个,中断/终止它,还是生成更多的熵。
  • 你通常没有足够的熵。 做一些工作(鼠标/键盘移动,(硬盘)I / O)。

从外部生成一个密钥对

无论如何,在真机上生成一个密钥可能更合理,而且只能将(私有) 子密钥移动到服务器。 这样,你可以不时地交换子密钥(以防万一)。 阅读什么是一个很好的通用GnuPG密钥设置? 了解设置OpenPGP密钥时需要考虑的不同事项。

在构buildDocker镜像时,使用COPY将文件导入机器,然后使用gpg --import将其导入到Dockerfile中。 之后,如果使用gpg --gen-key在容器内生成它,它的使用方式与之前的方法完全相同。

Dockerfile docker build之外生成密钥,在Dockerfile的同一目录树内。 然后,您可以将图像ADD到图像中,并可以正确使用。 请记住,这个图像现在包含一个私人的GPG密钥,所以它需要像保持密钥一样保持私密。

如果您想在正在运行的容器中使用密钥(而不是在构build映像时),请使用-v标志将密钥文件安装到映像中。 (这允许您发布您的图像,而不公布您的私钥。

我设法通过在连接到正在生成gpg密钥的docker容器时ping一些网站来大大加速熵生成。

 $ docker exec -it blimp_mailpilekermit_1 bash mailpile@mailpile-kermit:~$ ping google.com & mailpile@mailpile-kermit:~$ ping cloudfleet.io & mailpile@mailpile-kermit:~$ cat /proc/sys/kernel/random/entropy_avail 757 

这使gpg进程相对较快地完成了2048位密钥的生成。

ping外部接口(来自另一个主机)的泛洪也会将熵添加到池中。

例如。 ping -f $ EXTERNALIP

需要成为根,最好不要在你关心的networking上这样做。