如何重新同步 saltstack?reposync 失败,并显示错误消息“由于缺少 GPG 密钥,正在删除 [...]。”

Edw*_*vey 5 gpg saltstack reposync

在 RHEL 7.4 系统上,我添加了 salt-latest 存储库,如下所示:

yum -y install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
Run Code Online (Sandbox Code Playgroud)

请注意,除其他事项外,这会创建以下两个 GPG 密钥文件:

/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7-Salt
/etc/pki/rpm-gpg/saltstack-signing-key
Run Code Online (Sandbox Code Playgroud)

为了供以后参考,请注意 CentOS 密钥的指纹以 f4a80eb5 结尾:

# gpg --quiet --with-fingerprint /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7-Salt

pub  4096R/F4A80EB5 2014-06-23 CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>
      Key fingerprint = 6341 AB27 53D7 8A78 A7C2  7BB1 24C6 A8A7 F4A8 0EB5
Run Code Online (Sandbox Code Playgroud)

尝试重新同步下载:

mkdir /root/foobar

reposync --gpgcheck --plugins --repoid=salt-latest --download_path=/root/foobar --newest-only --downloadcomps --delete --download-metadata
Run Code Online (Sandbox Code Playgroud)

它失败并出现如下错误:

Removing babel-0.9.6-8.el7.noarch.rpm, due to missing GPG key.
Removing libyaml-0.1.4-11.el7_0.i686.rpm, due to missing GPG key.
Removing libyaml-0.1.4-11.el7_0.x86_64.rpm, due to missing GPG key.
Run Code Online (Sandbox Code Playgroud)

因此,我手动下载所有失败的文件(在 for 循环中)并检查其签名密钥的签名。它们都是相同的,所以这里仅举其中之一为例:

wget http://repo.saltstack.com/yum/redhat/7/x86_64/latest/base/babel-0.9.6-8.el7.noarch.rpm

rpm -K babel-0.9.6-8.el7.noarch.rpm

babel-0.9.6-8.el7.noarch.rpm: RSA sha1 ((MD5) PGP) md5 NOT OK (MISSING KEYS: (MD5) PGP#f4a80eb5)
Run Code Online (Sandbox Code Playgroud)

请注意,该密钥PGP#f4a80eb5与上面引用的密钥 相匹配F4A8 0EB5。那么为什么 gpg 检查失败呢?

我尝试过的事情包括:

  • 我编辑/etc/yum.repos.d/salt-latest.repo并更改了该gpgkey=行。我对所有这三种变体都遇到了同样的失败。据我所知,更改gpgkey=线路没有任何效果:

    gpgkey=file:///etc/pki/rpm-gpg/saltstack-signing-key
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7-Salt
    gpgkey=file:///etc/pki/rpm-gpg/saltstack-signing-key,file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7-Salt
    
    Run Code Online (Sandbox Code Playgroud)
  • 我尝试reposync在没有--gpgcheck. 它有效,但显然,这样使用它是不好的。

    reposync --plugins --repoid=salt-latest --download_path=/root/foobar --newest-only --downloadcomps --delete --download-metadata
    
    Run Code Online (Sandbox Code Playgroud)
  • 我想知道 reposync 是否拒绝使用该密钥,因为它太弱了?MD5。但我想不出有什么办法可以证实或否认这一点。

  • 我想知道钥匙是否真的有有效期?但我也找不到任何方法来证实或否认这一点。

Edw*_*vey 5

我偶然发现了答案!看来,rpm必须将密钥库保存在与 分开的地方,并且在存储库文件中指定该行/etc/pki/rpm-gpg似乎不够。gpgkey=

执行此操作后,reposync可以正常工作并正确验证所有文件的所有签名:

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7-Salt
Run Code Online (Sandbox Code Playgroud)

另请参阅rpm 在哪里安装自定义 gpg 密钥?。密钥存储在 rpm 数据库中,可以使用以下命令查询和删除:

List the installed keys
    rpm -qa gpg-pubkey*

Get info about a particular installed key
    rpm -qi gpg-pubkey-db42a60e

Remove a particular installed key
    rpm -e gpg-pubkey-db42a60e
Run Code Online (Sandbox Code Playgroud)

与 @sciurus 的答案相反,此信息不在手册页中(至少在 RHEL 7.4 中没有)。