gpt4 book ai didi

docker - 下载带有 `gpg --recv-key` 的 key 并同时在脚本中检查指纹

转载 作者:行者123 更新时间:2023-12-02 09:53:17 26 4
gpt4 key购买 nike

如何通过 gpg --recv-key 导入 key 并自动检查其指纹?理想情况下,我会直接使用 gpg --recv-key $fingerprint,但是 gpg only recently added a check ,接收到的 key 实际上具有正确的指纹,而不是盲目地信任 key 服务器,并且该修复尚未在我关心的所有发行版中落地(例如 Docker Ubuntu 镜像仍然具有旧的 gpg 版本)。

我想将它与 apt-key 结合使用,将 PPA 添加到 Docker 容器。

最佳答案

解决方案:

#!/bin/bash
set -e
tempName=$(mktemp)
gpg --status-fd 1 --keyserver keyserver.ubuntu.com --recv-keys $fingerprint 1> $tempName 2>/dev/null
grep "^\[GNUPG\:\] IMPORT_OK "[[:digit:]]*" "$fingerprint"$" $tempName
grep "^\[GNUPG\:\] IMPORT_RES 1" $tempName

如果无法下载 key 或 key 服务器返回恶意 key ,则此脚本将返回非零退出代码。注意:恶意 key 仍然存在于 gpg key 环中,因此,如果您在 Dockerfile 之外使用它,您可能会想要在之后恢复原始 key 环。 Dockerfile 中使用的命令(以添加 rust PPA 为例):

RUN echo "deb http://ppa.launchpad.net/hansjorg/rust/ubuntu trusty main" >> /etc/apt/sources.list
RUN echo "deb-src http://ppa.launchpad.net/hansjorg/rust/ubuntu trusty main" >> /etc/apt/sources.list
RUN bash -c 'set -e;tempName=$(mktemp);apt-key adv --status-fd 1 --keyserver keyserver.ubuntu.com --recv-keys C03264CD6CADC10BFD6E708B37FD5E80BD6B6386 1> $tempName 2>/dev/null;grep "^\[GNUPG\:\] IMPORT_OK [[:digit:]]* C03264CD6CADC10BFD6E708B37FD5E80BD6B6386$" $tempName;grep "^\[GNUPG\:\] IMPORT_RES 1" $tempName'

说明:

要考虑的第一个构建 block 是 GnuPGs --status-fd 选项。它告诉 gpg 将机器可读的输出写入给定的文件描述符。文件描述符 1 始终引用 stdout,因此我们将使用它。然后我们必须找出 --status-fd 的输出是什么样的。相关文档不在联机帮助页中,而是在 doc/DETAILS 中。示例输出如下所示:

# gpg --status-fd 1 --keyserver keyserver.ubuntu.com --recv-keys BD6B6386 2>/dev/null
[GNUPG:] IMPORTED 37FD5E80BD6B6386 Launchpad PPA for Hans Jørgen Hoel
[GNUPG:] IMPORT_OK 1 C03264CD6CADC10BFD6E708B37FD5E80BD6B6386
[GNUPG:] IMPORT_RES 1 0 1 1 0 0 0 0 0 0 0 0 0 0

因此,我们正在寻找 IMPORT_OKIMPORT_RES 行。 IMPORT_OK之后的第二个参数是导入 key 的实际指纹。 IMPORT_RES 之后的第一个参数是导入的 key 数量。

在输出中,gpg escapes newlines ,因此可以匹配以 [GNUPG:] 开头的行来断言我们不匹配攻击者控制的字符串(例如 key 中的名称字段可能包含 \n[GNUPG:] IMPORT_OK 1 C03264CD6CADC10BFD6E708B37FD5E80BD6B6386] 并通过创建匹配来欺骗我们)。

使用 grep,我们可以通过 grep "^\[GNUPG\:\]" 匹配以 [GNUPG] sometext 开头的行,以及以 grep "^\[GNUPG\:\] sometext$" (^$ 表示行的开头和结尾)。根据文档,IMPORT_OK 后面的任何数字对我们来说都可以,因此我们与 "[[:digit:]]*" 进行匹配。因此,作为正则表达式,我们得到 "^\[GNUPG\:\] IMPORT_OK "[[:digit:]]*""$fingerprint"$""^\[GNUPG\:\] IMPORT_RES 1"

由于我们想要匹配输出两次,因此我们将其安全保存到临时文件中(通过使用 mktemp 创建一个空的临时文件并在该文件中重新路由输出)。如果 grep 不匹配任何行,它会返回一个非零错误代码。我们可以通过 set -e 指示 bash 中止任何错误来使用它。总的来说,我们最终得到:

set -e
tempName=$(mktemp)
gpg --status-fd 1 --keyserver keyserver.ubuntu.com --recv-keys $fingerprint 1> $tempName 2>/dev/null
grep "^\[GNUPG\:\] IMPORT_OK "[[:digit:]]*" "$fingerprint"$" $tempName
grep "^\[GNUPG\:\] IMPORT_RES 1" $tempName

如何使用 apt 添加存储库 key :apt-key 提供了 adv 命令,可以将命令行参数直接传递给 gpg(运行上述命令而不需要重新路由输出即可查看 apt 生成的实际 gpg 命令-键)。因此,我们只需将 gpgapt-key adv 交换即可对存储库 key 环进行操作。

关于docker - 下载带有 `gpg --recv-key` 的 key 并同时在脚本中检查指纹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26217766/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com