apt-get update для gitlab-runner для Ubuntu 20.04.6 LTS завершился неудачей из-за недействительной подписи.

Вопрос или проблема

Я пытаюсь выполнить команду 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
  Следующие подписи были недействительными: EXPKEYSIG 3F01618A51312F3F GitLab B.V. (ключ подписи репозитория пакетов) <[email protected]>
Чтение списков пакетов... Готово
W: Ошибка GPG: https://packages.gitlab.com/runner/gitlab-runner/ubuntu focal InRelease: Следующие подписи были недействительными: EXPKEYSIG 3F01618A51312F3F GitLab B.V. (ключ подписи репозитория пакетов) <[email protected]>
E: Репозиторий 'https://packages.gitlab.com/runner/gitlab-runner/ubuntu focal InRelease' не подписан.
N: Обновление из такого репозитория не может быть выполнено безопасно и поэтому по умолчанию отключено.
N: Смотрите руководство по apt-secure(8) для подробностей о создании репозитория и конфигурации пользователя.
У вас новая почта в /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: https://packages.gitlab.com/runner/gitlab-runner/ubuntu focal InRelease: Следующие подписи были недействительными: EXPKEYSIG 3F01618A51312F3F GitLab B.V. (ключ подписи репозитория пакетов) <[email protected]>

Я также пробовал шаги из многочисленных постов, найденных здесь и там, чтобы обновить ключ подписи репозитория, но ничего не работает – ошибка остается прежней.

Кажется, это простая операция – обновить ключ подписи репозитория для репозитория APT – но -как- именно я должен это сделать, чтобы позволить gitlab-runner снова обновляться и поддерживаться в Ubuntu 20.04.6 LTS?

Этот ключ

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

считается недействительным командой “apt-get update” для репозитория APT gitlab-runner, независимо от того, что я делаю.

Есть идеи?

Спасибо!

(PS – Знаю, что “apt-key” устарел, но мне просто НУЖНО обновить gitlab-runner, чтобы он снова стал обновляемым, не беспокоюсь сейчас о том, что “apt-key” устарел. После того, как я обновлю gitlab-runner, я могу потратить время на изучение того, как использовать gpg вместо apt-key для будущих истечений подписи.)

Официальный ответ на эту проблему (источник текста с следующей ссылки):

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

Обновление ключей после истечения срока действия

Для дистрибутивов на базе Debian:

PackageCloud в целом использовал apt-key, который будет устаревать в будущем. Вручную установленные или сконфигурированные репозитории из некоторых дистрибутивов уже используют поддержку signed-by в списках источников пакетов Debian.

  1. Определите, используете ли вы функциональность apt-key или signed-by:

     grep 'deb \[signed-by=' /etc/apt/sources.list.d/gitlab_gitlab-?e.list
    
  2. Если этот grep вернул какие-либо строки, вы используете функциональность signed-by. Это имеет приоритет над любым использованием apt-key. Если этот grep не вернул строк, вы используете функциональность apt-key.

    Для signed-by следующий скрипт (запустите от имени 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
    

Вы можете использовать тот же шаг, который описан в инструкции по установке:

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

затем

apt update

Вы можете сделать то же самое, чтобы исправить gitlab-ce и gitlab-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

Вы можете обновить подпись вашего 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
указывает, где находится файл apt GitLab.

Но файл apt GitLab Runner находится.
/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

Для решения этой ситуации в 2024 году, особенно на старых установках, сначала нужно удалить уже добавленный gpg-ключ gitlab. Выполните команду:

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

и запустите последнюю установочную скрипт gitlab runner для Debian/Ubuntu/Mint:

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

Вот и все, теперь вы можете выполнить apt upgrade.

Больше деталей:

Обратите внимание, что apt-key в Debian 12 устарел, не уверен по поводу Ubuntu:

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

Так что правильный способ в общем должен заключаться в том, чтобы поместить расшифрованную подпись gpg в /etc/apt/trusted.gpg.d, но это не случай gitlab.

Если вы посмотрите на файл /etc/apt/sources.list.d/runner_gitlab-runner.list, вы заметите, что gpg-ключ упомянут напрямую:

# этот файл был сгенерирован packages.gitlab.com для
# репозитория по адресу 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

Вот причина, почему ручное добавление gpg-ключа с помощью apt-key не решает проблему. Повторное выполнение установочного скрипта развернет последнюю подпись ключа.

Обратите внимание, что я тестировал это в ubuntu jammy.

   wget -qO-  https://packages.gitlab.com/gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/omnibus_gitlab_gpg.key

Переместите старый sources.list для этого пакета
и перезагрузите с помощью команды curl скрипт из инструкций по установке.

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

Мой sources.list выглядит так:

cat /etc/apt/sources.list.d/runner_gitlab-runner.list 
# этот файл был сгенерирован packages.gitlab.com для
# репозитория по адресу 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/ubuntu/ jammy main
    deb-src [signed-by=/usr/share/keyrings/runner_gitlab-runner-archive-keyring.gpg] https://packages.gitlab.com/runner/gitlab-runner/ubuntu/ jammy main

Не забудьте адаптировать это к вашему выпуску.

Причина, по которой эти ключи истекают, заключается в безопасности – так как рабочие станции сотрудников GitLab являются очень ценными целями, предпочтительно генерировать новые ключи примерно каждые 2-4 года – принимая во внимание, что рабочие станции сотрудников GitLab периодически переустанавливаются с новыми операционными системами, также в надежде устранить возможное вредоносное ПО. Из-за этого нам всем приходится обновлять эти ключи подписи каждые несколько лет. Я сталкивался с аналогичными ошибками при обновлении ключей архивов во время apt update (не только от GitLab) в прошлом, и подробное объяснение проблемы можно найти здесь, которое подробно описывает, почему подпись для gitlab истекла и как это исправить.

Некоторый несколько загадочный фрагмент BASH, предоставленный gitlab начиная с awk проходит по файлу /etc/apt/sources.list.d/runner_gitlab-runner.list построчно, чтобы найти строку signed-by=, извлечь путь к файлу ключей gpg архивов, загрузить новый ключ подписи gitlab и импортировать его в извлеченный путь к файлу ключей архивов.

Команда apt-key, которая управляет только /etc/apt/trusted.gpg в Debian, больше не используется в новых установках GitLab – как показывает /etc/apt/sources.list.d/gitlab_gitlab-ce.list в большинстве современных установок GitLab, теперь используется специальный файл /usr/share/keyrings/gitlab_gitlab-ce-archive-keyring.gpg.

Если ваш /etc/apt/sources.list.d/gitlab_gitlab-ce.list содержит строку signed-by=, следующий однострочник может быть использован для обновления ключей с новым ключом подписи:

wget -qO- https://packages.gitlab.com/gpg.key | gpg --no-default-keyring --keyring /usr/share/keyrings/gitlab_gitlab-ce-archive-keyring.gpg --import

Если ваш /etc/apt/sources.list.d/gitlab_gitlab-ce.list не содержит строки signed-by=, вы должны предпочесть использовать метод apt-key следующим образом:

curl -s https://packages.gitlab.com/gpg.key | apt-key add -

Предупреждение, которое отображается в этом случае:

Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).

Можно проигнорировать на данный момент. Вот более подробное объяснение предупреждения apt-key.

Просто для дополнительной информации,
файл GPG ключа имеет 2 разных формата: Armored ASCII (расширение файла .asc) и стандартный двоичный формат (расширение файла .gpg).

Обратите внимание на расширение в файле списков источников

Для Armored ASCII

curl -sSfL https://packages.gitlab.com/runner/gitlab-runner/gpgkey | tee /etc/apt/keyrings/runner_gitlab-runner-archive-keyring.asc

В /etc/apt/sources.list.d/runner_gitlab-runner.list (в моей среде это Ubuntu Jammy)

deb     [signed-by=/etc/apt/keyrings/runner_gitlab-runner-archive-keyring.asc] https://packages.gitlab.com/runner/gitlab-runner/ubuntu/ jammy main
deb-src [signed-by=/etc/apt/keyrings/runner_gitlab-runner-archive-keyring.asc] https://packages.gitlab.com/runner/gitlab-runner/ubuntu/ jammy main

Для двоичной версии

curl -sSfL https://packages.gitlab.com/runner/gitlab-runner/gpgkey | gpg --dearmor -o /etc/apt/keyrings/runner_gitlab-runner-archive-keyring.gpg

В /etc/apt/sources.list.d/runner_gitlab-runner.list (в моей среде это Ubuntu Jammy)

deb     [signed-by=/etc/apt/keyrings/runner_gitlab-runner-archive-keyring.gpg] https://packages.gitlab.com/runner/gitlab-runner/ubuntu/ jammy main
deb-src [signed-by=/etc/apt/keyrings/runner_gitlab-runner-archive-keyring.gpg] https://packages.gitlab.com/runner/gitlab-runner/ubuntu/ jammy main

Вышеуказанные ответы отличные для получения последнего ключа.. но у меня все еще возникает ошибка

W: Ошибка GPG: https://packages.gitlab.com/runner/gitlab-runner/ubuntu noble InRelease: Следующие подписи не могут быть проверены, так как публичный ключ не доступен: NO_PUBKEY 3F01618A51312F3F
E: Репозиторий 'https://packages.gitlab.com/runner/gitlab-runner/ubuntu noble InRelease' не подписан.
N: Обновление из такого репозитория не может быть выполнено безопасно и поэтому по умолчанию отключено.
N: Смотрите руководство по apt-secure(8) для подробностей о создании репозитория и конфигурации пользователя.

Что было связано с правами на файл ключа:
-rw-r—– 1 root root 2298 Dec 6 13:28 /usr/share/keyrings/runner_gitlab-runner-archive-keyring.gpg

После установки chmod 644 на файл ключа моя команда apt update && apt upgrade сработала отлично, поэтому просто проверьте права на файл ключа, который вы скачиваете.

Ответ или решение

Ситуация, с которой вы столкнулись при попытке выполнить обновление GitLab Runner на Ubuntu 20.04.6 LTS, связана с истечением срока действия ключа подписи пакетов, что приводит к ошибке: INVALID SIGNATURE (неверная подпись). Если вы видите сообщение об ошибке EXPKEYSIG 3F01618A51312F3F, это означает, что используемый ключ для проверки подписи ваших пакетов GitLab стал недействительным. Давайте рассмотрим, как вы можете устранить эту ошибку и успешно обновить GitLab Runner.

1. Проверка текущей конфигурации репозитория

Сначала убедитесь, что у вас правильно настроены источники для GitLab Runner. Откройте файл, который описывает ваш репозиторий:

cat /etc/apt/sources.list.d/runner_gitlab-runner.list

В этом файле должна быть строка, подобная следующей:

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

2. Удаление старого ключа

Если вы использовали apt-key (что, как вы уже заметили, устарело), удалите ранее добавленный ключ:

sudo apt-key del 3F01618A51312F3F

3. Получение нового ключа

Теперь получите новый ключ и добавьте его в ваш ключевой хранилище. Рекомендуется использовать команду gpg для надежного хранения:

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

4. Обновление индекса пакетов

После выполнения всех предыдущих шагов, обновите индекс пакетов:

sudo apt update

Эта команда должна завершиться успешно, и вы не должны видеть сообщения об ошибках, связанных с неверной подписью.

5. Проверка прав доступа к ключевому файлу

Если вы все еще сталкиваетесь с ошибками, проверьте права доступа к файлу ключа:

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

Убедитесь, что у файла есть права доступа 644. Если это не так, исправьте это:

sudo chmod 644 /usr/share/keyrings/runner_gitlab-runner-archive-keyring.gpg

6. Заключение

После выполнения всех вышеперечисленных шагов, вы сможете успешно выполнить apt update и далее произвести обновление пакетов с помощью apt upgrade. Данная процедура поможет справиться с проблемой устаревших ключей, а также обеспечит вам регулярные обновления GitLab Runner, гарантируя, что вы всегда будете использовать последнюю версию программного обеспечения с актуальными исправлениями безопасности.

Помните, что устаревшие ключи подписи — это распространенная проблема, поэтому периодически стоит проверять обновления ключей для всех используемых вами репозиториев, чтобы избежать возникновение подобных ошибок в будущем.

Оцените материал
Добавить комментарий

Капча загружается...