如何处理临时的apt-key adv失败?

时间:2016-06-21 18:32:14

标签: docker debian gnupg apt openpgp

我有一个dockerfile,可以动态添加OpenPGP密钥。问题是密钥服务器hkp://pgp.mit.edu:80无法不时响应。有什么办法可以避免这种浪费时间的浪费吗?

1 个答案:

答案 0 :(得分:4)

问题

经常使用的密钥服务器pool.sks-keyserver.net实际上不是单个服务器,而是整个密钥服务器池,您可以通过DNS随机选择。它们彼此同步,并且由于存在大量服务器,您可以假设其中任何一个都可用。但并非所有这些都非常稳定,许多服务器由个人提供,甚至在家里运行。选择一个固定的服务器,如果服务器非常可靠,你引用的麻省理工学院就会知道,但关键服务器通常会不时发生故障。

keys.gnupg.net实际上指向pool.sks-keyservers.net(更具体的是,设置了CNAME条记录。)

虽然每次查询池时都会返回一大堆服务器,但GnuPG只会选择其中一个。如果服务器没有响应,GnuPG只是失败而不是尝试另一个(甚至并行尝试多个)。

可能的解决方案

所有这些解决方案都试图不查询密钥服务器网络,或者处理网络稳定性降低。

  • 将密钥的本地副本添加到存储库

    这是我在重新编写Dockerfiles时选择的方式。我将签名密钥的最小副本添加到包含Dockerfile的git存储库,然后将其导入到映像中。我写的prosody Dockerfile中的一个例子:

    COPY 107D65A0A148C237FDF00AB47393D7E674D9DBB5.gpg /root
    RUN apt-key add /root/107D65A0A148C237FDF00AB47393D7E674D9DBB5.gpg && \
        echo deb http://packages.prosody.im/debian jessie main >>/etc/apt/sources.list && \
        apt-get update
    

    此策略的优点是不依赖任何外部资源,也不会拉动可能会大幅放大图像的所有签名(如果OpenPGP密钥上有大量签名,则可轻松扩展到多个MB)。如果您在带外验证密钥并添加经过验证的密钥(事实上,使用它从密钥服务器网络中拔出密钥的指纹并没有太大差别,那么您无论如何都不需要签名。无论如何)。一个可能的缺点是您不会获取撤销,因此请查看密钥,邮件列表,安全通知,......对于极少数情况,密钥被泄露并在之后被撤销。

  • 从存储库服务器中提取

    如果您从存储库服务器中提取密钥(假设它们提供下载),您也可以直接从那里拉出来。与存储本地副本相比,我没有看到任何相关优势。您必须确保拉出正确的键(即,验证指纹)。如果服务器遭到入侵(并且上传了受管理的包),他们仍然可以操纵密钥(即,禁止撤销证书)。

  • 使用特定密钥服务器

    如果您了解特定的,非常可靠的密钥服务器,则始终可以通过--keyserver选项选择固定服务器。例如,如果您希望Ubuntu的服务器超级稳定(或托管您自己的服务器,但请确保将其包含在密钥服务器网络中),请考虑选择此服务器。

  • <强>重试。

    重试获取密钥,直到成功为止。其中一台服务器肯定会没问题。缺点:构建映像在构建时间方面更加不稳定,网络故障将导致无限循环(除非您添加一些最大重试次数)。您必须自己编写脚本。

  • 选择高可用性池

    ha.pool.sks-keyservers.net,要求包含的服务器是高可用性群集设置。如果反向代理/负载均衡器已关闭,您仍会被卡住;但期望一般可用性远高于通常的pool.sks-keyservers.net。如果人们关心提供群集设置,他们可能正确地监控他们的系统。

    如果您想坚持使用密钥服务器网络,这可能是最好的方法。将本地副本与此池混合(并回退到本地副本)也可能是可行的,因为有时会因为关键服务器超时而仍然没有构建失败,因此很有可能捕获被撤销密钥的罕见事件。 / p>