适用于 Ubuntu 20.04.6 LTS 的 gitlab-runner 的 apt-get 更新因签名无效而失败

适用于 Ubuntu 20.04.6 LTS 的 gitlab-runner 的 apt-get 更新因签名无效而失败

我正在尝试运行 apt-get update 并收到 gitlab-runner 的此错误:

# apt-get update
.
.
.
Get:6 https://packages.gitlab.com/runner/gitlab-runner/ubuntu focal InRelease [23.5 kB]
Err:6 https://packages.gitlab.com/runner/gitlab-runner/ubuntu focal InRelease
  The following signatures were invalid: EXPKEYSIG 3F01618A51312F3F GitLab B.V. (package repository signing key) <[email protected]>
Reading package lists... Done
W: GPG error: https://packages.gitlab.com/runner/gitlab-runner/ubuntu focal InRelease: The following signatures were invalid: EXPKEYSIG 3F01618A51312F3F GitLab B.V. (package repository signing key) <[email protected]>
E: The repository 'https://packages.gitlab.com/runner/gitlab-runner/ubuntu focal InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
You have new mail in /var/mail/root
#
.
.
.

我已阅读过几篇有关这个完全相同的错误的帖子,但没有任何内容能够解决我的问题。

官方 GitLab 签名密钥指南https://docs.gitlab.com/omnibus/update/package_signatures.html#package-repository-metadata-signing-keys并不能解决问题。

上述页面建议:

 awk '/deb \[signed-by=/{
       pubkey = $2;
       sub(/\[signed-by=/, "", pubkey);
       sub(/\]$/, "", pubkey);
       print pubkey
     }' /etc/apt/sources.list.d/gitlab_gitlab-?e.list | \
   while read line; do
     curl -s "https://packages.gitlab.com/gpg.key" | gpg --dearmor > $line
   done

或者

 apt-key del 3F01618A51312F3F
 curl -s "https://packages.gitlab.com/gpg.key" | apt-key add -
 apt-key list 3F01618A51312F3F

解决 gitlab-runner 的软件包存储库签名密钥过期的问题,但错误仍然完全相同:

W: GPG error: https://packages.gitlab.com/runner/gitlab-runner/ubuntu focal InRelease: The following signatures were invalid: EXPKEYSIG 3F01618A51312F3F GitLab B.V. (package repository signing key) <[email protected]>

我还尝试了这里和其他地方的众多帖子中的步骤来更新存储库签名密钥,但没有任何效果 - 错误仍然一样。

这似乎是一个简单的操作 - 更新 APT 存储库的存储库签名密钥 - 但是 - 我究竟该如何做才能使 gitlab-runner 再次在 Ubuntu 20.04.6 LTS 中更新和维护?

此键

https://packages.gitlab.com/gpg.key

无论我做什么,都被 gitlab-runner APT 存储库的“apt-get update”命令视为无效。

有任何想法吗?

谢谢!

(PS - 意识到“apt-key”已被弃用,但我只需要让 gitlab-runner 再次更新/可更新,现在不介意“apt-key”已被弃用。在更新 gitlab-runner 后,我可以花时间学习如何在将来的签名到期时使用 gpg 本身而不是 apt-key。)

答案1

该问题的官方答案(原文来源于以下链接):

https://docs.gitlab.com/omnibus/update/package_signatures#update-keys-after-expiry-extension

延长到期期限后更新密钥

对于基于 Debian 的发行版:

PackageCloud 通常使用 apt-key,但将来会弃用。某些发行版中手动安装或配置的存储库已使用 Debian 软件包源列表中的签名支持。

  1. 确定您是否正在使用 apt-key 或signed-by功能:

     grep 'deb \[signed-by=' /etc/apt/sources.list.d/gitlab_gitlab-?e.list
    
  2. 如果此 grep 返回任何行,则表示您正在使用签名功能。这优先于任何 apt-key 用法。如果此 grep 不返回任何行,则表示您正在使用 apt-key 功能。

    对于签名,以下脚本(以 root 身份运行)将更新 GitLab 存储库的公钥:

    awk '/deb \[signed-by=/{
        pubkey = $2;
        sub(/\[signed-by=/, "", pubkey);
        sub(/\]$/, "", pubkey);
        print pubkey
      }' /etc/apt/sources.list.d/gitlab_gitlab-?e.list | \
    while read line; do
      curl -s "https://packages.gitlab.com/gpg.key" | gpg --dearmor > $line
    done
    
  3. 对于 apt-key,以下脚本(以 root 身份运行)更新 GitLab 存储库的公钥:

    apt-key del 3F01618A51312F3F  
    curl -s "https://packages.gitlab.com/gpg.key" | apt-key add -
    apt-key list 3F01618A51312F3F
    

答案2

您可以使用安装脚本

curl -fsSL "https://packages.gitlab.com/runner/gitlab-runner/gpgkey" | gpg --dearmor > /usr/share/keyrings/runner_gitlab-runner-archive-keyring.gpg

然后

apt update

您可以使用相同的方法来修复gitlab-cegitlab-ee

curl -fsSL "https://packages.gitlab.com/runner/gitlab-runner/gpgkey" | gpg --dearmor > /usr/share/keyrings/gitlab_gitlab-ee-archive-keyring.gpg
curl -fsSL "https://packages.gitlab.com/runner/gitlab-runner/gpgkey" | gpg --dearmor > /usr/share/keyrings/gitlab_gitlab-ce-archive-keyring.gpg

答案3

您可以按照以下说明更新您的 GitLab Runner 签名。

1.如何解决这个问题。

需要修复的命令如下

awk '/deb \[signed-by=/{
    pubkey = $2;
    sub(/\[signed-by=/, "", pubkey);
    sub(/\]$/, "", pubkey);
    print pubkey
  }' /etc/apt/sources.list.d/runner_gitlab-runner.list | \
  while read line; do
    curl -s "https://packages.gitlab.com/gpg.key" | gpg --dearmor > $line
  done

2. 与原版的区别

/etc/apt/sources.list.d/gitlab_gitlab-?e.list
表示 GitLab apt 文件所在的位置。

但是 GitLab Runner apt 文件是
/etc/apt/sources.list.d/runner_gitlab-runner.list。。

/etc/apt/sources.list.d/gitlab_gitlab-?e.list文件在运行 Runner 的机器上不存在,因此上述原始命令不会创建密钥签名文件。

3.检查密钥签名文件是否存在。

运行上述命令,查看是否创建了以下文件。
/usr/share/keyrings/runner_gitlab-runner-archive-keyring.gpg

ls -la /usr/share/keyrings/runner_gitlab-runner-archive-keyring.gpg

答案4

为了在 2024 年解决这种情况,特别是在旧安装中,首先我们需要删除已添加的 gitlab apt gpg 密钥。运行以下命令:

sudo apt-key del "F640 3F65 44A3 8863 DAA0 B6E0 3F01 618A 5131 2F3F"

并运行适用于 Debian/Ubuntu/Mint 的最新 gitlab runner 安装脚本:

curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash && sudo apt update

就这样,现在你就可以做了apt upgrade

更多细节:

请注意,Debian 12 上的 apt-key 已经过时,不确定 Ubuntu 是否也是如此:

root@gitlab-runner:~# apt-key list
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).

因此,通常正确的方法应该是将 dearmored gpg 签名放入 /etc/apt/trusted.gpg.d,但这不是 gitlab 的情况。

如果你查看/etc/apt/sources.list.d/runner_gitlab-runner.list文件,你会注意到直接提到的 gpg 密钥:

# this file was generated by packages.gitlab.com for
# the repository at https://packages.gitlab.com/runner/gitlab-runner

deb [signed-by=/usr/share/keyrings/runner_gitlab-runner-archive-keyring.gpg] https://packages.gitlab.com/runner/gitlab-runner/debian/ bookworm main
deb-src [signed-by=/usr/share/keyrings/runner_gitlab-runner-archive-keyring.gpg] https://packages.gitlab.com/runner/gitlab-runner/debian/ bookworm main

这就是为什么使用 apt-key 手动添加 gpg 密钥无法解决问题的原因。再次执行安装脚本将部署最新的密钥签名。

相关内容