AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1286545
Accepted
user1160711
user1160711
Asked: 2020-10-25 05:33:23 +0800 CST2020-10-25 05:33:23 +0800 CST 2020-10-25 05:33:23 +0800 CST

哪些命令(确切地说)应该替换已弃用的 apt-key?

  • 772

在新的 ubuntu 20.10 虚拟机上为本地存储库设置密钥,我收到一条消息,提示 apt-key add 已弃用,我应该阅读apt-key(8) 手册页。( apt-key8) 手册页是串在一起的单词的集合,但如果它包含信息,我就无法将其剔除。谁能告诉我,我应该在终端上输入什么,而不是:

apt-key add name-of-file

在向我鸣喇叭后,该命令显然仍然有效,所以我能够继续,但想知道我将来需要做什么。

repository keyrings apt
  • 7 7 个回答
  • 52903 Views

7 个回答

  • Voted
  1. Askeli
    2021-01-12T12:34:00+08:002021-01-12T12:34:00+08:00

    您需要知道为什么 apt-key add不推荐使用

    到目前为止,所有答案都解决了症状(“不要使用apt-key add”),但未能解决导致被弃用的实际问题。apt-key add问题不在于将密钥附加到一个大密钥环文件而不是etc/apt/trusted.gpg手动将单密钥密钥环文件放入目录/etc/apt/trusted.gpg.d/中。这两件事是等价的,做任何一件都是巨大的安全风险。

    问题是您添加到上述任何一个的任何密钥都完全且无条件地被 apt 信任。这意味着当从任何 repo(包括官方发行版 repos)安装任何包时,apt 将愉快地接受由任何这些受信任密钥(无论密钥是否属于包来自的存储库)签名的包。这削弱了包签名机制提供的防止恶意包被注入官方 Ubuntu 镜像网络的保证。

    相反,我们想要做的是将 apt 配置为仅在从该存储库安装的软件包上接受来自第三方存储库的签名——没有交叉签名。Apt 的默认固定规则为官方发行版存储库提供更高的优先级,它(与适当的密钥管理相结合)提供了一些保护,防止第三方存储库替换发行版提供的软件包。(至少,我认为这是默认设置。您可以使用它apt-cache policy来检查当前的 pin 优先级,如果需要,您可以根据需要调整 pinningorigin以达到此效果。详情请参阅man apt_preferences。)

    Ugo Delle Donne 的答案中给出的将密钥转换为 apt 将接受的(旧)密钥环 v4 格式的说明是正确且有用的,但这只是解决方案的一半。我将在这里重申它们(稍微清理一下),以便将所有步骤合并到一个地方:

    • 下载密钥:
      • wget https://host.domain.tld/path/to/<keyfile>.<ext>
        (不需要-Oor >;wget默认将文件保存在当前目录中,文件名与服务器上的文件名相同。)
    • 验证文件类型是否为“PGP 公钥块公钥(旧)”:
      • file <keyfile>.<ext>
    • gpg支持多种密钥格式,因此如果您的密钥格式不同,请将其导入临时密钥环,然后再次导出:
      • gpg --no-default-keyring --keyring ./temp-keyring.gpg --import <keyfile>.<ext>
      • gpg --no-default-keyring --keyring ./temp-keyring.gpg --export --output <your-keyfile-name>.gpg
      • rm temp-keyring.gpg

    现在您已经有了转换后的密钥,不要通过将apt其复制到/etc/apt/trusted.gpg.d/. 相反,把它放在像/etc/apt/keyrings/. (您可能需要先创建该keyrings目录。)该位置没有什么特别之处,它只是man 5 sources.listUbuntu 22.04 和相关Debian Wiki条目中推荐的约定。

    此时,什么都没有改变,apt也不知道密钥存在。最后一步是修改.list存储库的特定文件,以告诉 apt 在哪里可以找到该特定 repo的密钥。

    • 编辑文件/etc/apt/sources.list.d/<example>.list,并在deburl 之间添加[signed-by=/etc/apt/keyrings/<your-keyfile-name>.gpg]

    现在 apt 将接受该 repo 中所有包的密钥签名,并且只接受该 repo。

    笔记:

    • 如果您已经有密钥环文件/etc/apt/trusted.gpg.d/,您可以将它们复制 到原样,然后更新所有相应的文件,以便每个文件都有一个指向其自己密钥的字段。/etc/apt/keyrings/.listsigned-by
    • 如果您在密钥环/etc/apt/trusted.gpg文件中已经拥有官方 repo 密钥之外的密钥,则此答案详细说明了查找和删除它们的步骤。然后,您可以按照上述所有相同步骤以更安全的方式进行设置。(也可以从该密钥环中导出它们,但具体步骤留给读者练习。)
    • 要将存储库的密钥从密钥服务器导入独立文件:
      • gpg --no-default-keyring --keyring <output-file-name>.gpg --keyserver <some.keyserver.uri> --recv-keys <fingerprint>
      • 这应该为您提供 apt 无需转换即可接受的密钥。
    • Apt 仍然非常值得信赖,恶意或受损的 repo 可以轻松绕过此措施,因为包目前可以在其设置脚本中以 root 身份运行任意 shell 代码。不过,关闭一个攻击媒介并没有什么坏处,而且其他方面正在(缓慢地)取得进展。
    • Deb822或者,您可以使用单个.sources文件而不是文件切换到更新、更详细的格式.list。这是更多的工作,但我个人发现结果更具可读性。

    资料来源:

    • Debian 维基
    • 关于 Unix&Linux StackExchange 的优秀而详细的答案
    • 151
  2. Best Answer
    Ugo Delle Donne
    2020-12-15T09:03:50+08:002020-12-15T09:03:50+08:00

    我偶然发现了同样的问题,幸运的是,其他一些问题照亮了道路。在我的示例中,我试图向最近的 Kali linux 添加一个 teamviewer 存储库,但我被密钥验证阻止了。

    我很确定有一种更优雅的方法可以做到这一点,但以下步骤帮助我解决了这个问题:

    1. 下载相关密钥

      wget -O - https://download.teamviewer.com/download/linux/signature/TeamViewer2017.asc > ~/teamviewer.key

    2. 验证文件类型

      file ~/teamviewer.key

      它应该是PGP 公钥块公钥(旧)

    3. 创建密钥环

      gpg --no-default-keyring --keyring ./teamviewer_keyring.gpg --import teamviewer.key

    4. 该文件仍然不是可以添加到/etc/apt/trusted.gpg.d/的有效密钥,因为它是一个密钥环,但我们可以从密钥环中提取密钥

      gpg --no-default-keyring --keyring ./teamviewer_keyring.gpg --export > ./teamviewer.gpg

    5. 此文件是您要移动到受信任的密钥文件夹的密钥

      sudo mv ./teamviewer.gpg /etc/apt/trusted.gpg.d/

    开心sudo apt update!!!

    • 14
  3. zachsmthsn
    2020-12-28T19:48:40+08:002020-12-28T19:48:40+08:00

    弃用的原因是 usingapt-key add只是将 gpg 密钥附加到受信任的全局 APT 密钥环。它类似于 add to 而不是 using 的首选方法local_repo.list,/etc/apt/sources.list.d/后者add-apt-repository dep /link/to/repo version将消息附加到全局sources.list文件。

    我认为这比使用 .d 文件夹更难理解,但本质上我们希望将 gpg 密钥放入一个独立的密钥环文件中,然后在源列表中指向这个密钥环文件。默认密钥环文件位置是/usr/share/keyrings,它可以是 .asc 或 .gpg 文件。我不确定区别,但我知道全局密钥环文件是二进制文件,而不是纯文本。

    例如:

    使用通用名称有时可能有点难以理解,所以这里是一个安装 mongoDB 的示例:

    获取 MongoDB gpg 密钥并将其添加到新的密钥环文件中

    curl https://www.mongodb.org/static/pgp/server-4.2.asc | sudo tee -a /usr/share/keyrings/buster-mongodb-org-4_2.asc
    

    为 apt 添加一个源条目,指向这个新的密钥环

    echo "deb [signed-by=/usr/share/keyrings/buster-mongodb-org-4_2.asc] https://repo.mongodb.org/apt/debian buster/mongodb-org/4.2 main
    

    从这个新添加的 repo 安装 mongodb

    sudo apt install -y mongodb-org

    参考

    这对我来说仍然是新的,但我所知道的大部分来自unix SE 中的这个出色的答案

    • 9
  4. Artur Meinild
    2021-03-05T23:21:12+08:002021-03-05T23:21:12+08:00

    我创建了一个 shell 脚本,它可以下载和安装要[signed-by=]在sources.list.

    它可以在github.com/ameinild/add-apt-key上找到。

    用于安装 APT 密钥的 POSIX 脚本

    一般帮助

    此脚本将帮助安装 APT 存储库的 PGP 密钥。

    此脚本最多支持 2 个参数:

    • 第一个参数是输入文件。这可以是:
      • URL - 密钥将被下载到当前路径(使用 wget 或 curl)
      • 文件名 - 读取当前路径中的现有键
      • 路径和文件名 - 读取给定路径中的现有键
    • 第二个参数是关键输出路径和输出名称。这可以是:
      • 只有文件名 - 在配置中设置输出路径,保存为给定文件名
      • 路径和文件名 - 此处给出输出路径,保存为给定文件名
      • 只有一个路径(以 / 结尾) - 此处给出输出路径,文件名取自现有密钥
      • 空 - 在配置中设置输出路径,文件名取自现有密钥

    该脚本有一个配置文件/usr/local/etc/add-apt-key.conf,可以在其中设置以下变量:

    • keypath : 存储转换后密钥的路径 - 默认为/usr/share/keyrings
    • verbosity: 如果设置为 Yes - 显示额外的输出
    • removetmp:如果设置为是 - 删除输入(未转换)文件

    示例 1: ( PWD=/root)

    sudo add-apt-key https://mariadb.org/mariadb_release_signing_key.asc /usr/local/share/keyrings/
    

    将下载密钥/root,转换并存储为 /usr/local/share/keyrings/mariadb_release_signing_key.gpg

    示例 2: ( PWD=/home/user)

    sudo add-apt-key /root/mariadb_release_signing_key.asc /usr/local/share/keyrings/mariadbkey
    

    将使用现有的密钥/root,将其转换并存储为 /usr/local/share/keyrings/mariadbkey.gpg

    示例 3: ( PWD=/home/user)

    sudo add-apt-key mariadb_release_signing_key.asc mariadbkey
    

    将使用现有的密钥/home/user,将其转换并存储为 /usr/share/keyrings/mariadbkey.gpg

    安装 PGP 密钥后,还可以将密钥和存储库添加到/etc/apt/sources.list

    • 添加此选项的选项将作为第一个输入选项显示在脚本中
    • 如果选择是,则必须将存储库字符串粘贴为第二个输入选项

    这样就完成了密钥安装,将相应的存储库行添加到/etc/apt/sources.list

    安装

    通过运行以下命令进行安装:

    sudo curl -L https://raw.githubusercontent.com/ameinild/add-apt-key/master/add-apt-key -o /usr/local/bin/add-apt-key
    sudo curl -L https://raw.githubusercontent.com/ameinild/add-apt-key/master/add-apt-key.conf -o /usr/local/etc/add-apt-key.conf
    sudo chmod a+rx /usr/local/bin/add-apt-key
    
    • 5
  5. nyet
    2022-04-02T15:11:26+08:002022-04-02T15:11:26+08:00

    作为直接类似的工作,替换apt-key add为gpg --dearmor:

    curl [KEYURL] | sudo gpg --dearmor --yes -o /etc/apt/trusted.gpg.d/[KEYFILE].gpg

    但是,不建议这样做(除了与 apt-key 类似的工作),因为受信任目录中的所有密钥都是无条件受信任的;最好将输出放在(非全局)受信任的目录中(正如其他人所建议的那样),并让每个来源分别指定要信任的密钥。

    • 2
  6. kynan
    2021-01-10T08:16:16+08:002021-01-10T08:16:16+08:00

    供使用的密钥apt存储在/etc/apt/trusted.gpg.d/. apt-key为您管理这些密钥环,但现在它已被弃用,您需要<KEYRING>自己为密钥环选择合适的文件名。

    如果您已经将密钥作为本地文件<FILE>,请运行

    gpg --no-default-keyring --keyring=gnupg-ring:/etc/apt/trusted.gpg.d/<KEYRING>.gpg --import <FILE>
    

    要直接从中读取密钥<URL>,请运行

    curl -sSfL <URL> | gpg --no-default-keyring --keyring=gnupg-ring:/etc/apt/trusted.gpg.d/<KEYRING>.gpg --import
    

    注意:密钥环gnupg-ring:名称前的前缀是创建apt兼容(旧版)v4 格式的密钥环所必需的,而不是(较新的)keybox v1 格式。

    • 0
  7. Lockszmith
    2022-06-07T08:01:34+08:002022-06-07T08:01:34+08:00

    这里的所有答案都很棒,我在这里分享的是我从所有这些答案中得到的,并且自动化使我更容易设置机器。
    虽然在每台机器上添加 apt 源是一种罕见的情况,但我仍然会在多台机器、云机器等上执行此操作......

    以下是我为自己编写的 bash 脚本,用于在我用于 DevOps 工作的基于 ubuntu/pop-os 的机器上添加 APT 源堆栈:

    注意:不要只是复制粘贴,如果您不明白发生了什么 - 询问。这些是任何人都不应轻易采取的行动类型。

    我的add-my-apt-repos.sh脚本(GH?):

    #! /usr/bin/env bash
    
    # Make sure the /usr/share/keyrings dir exists
    sudo mkdir -p /usr/share/keyrings 2>&1 > /dev/null
    
    # Make sure all of the basic required tools are installed for the code
    # below to work
    sudo apt-get install --yes --no-install-recommends \
        curl gnupg software-properties-common apt-transport-https
    
    # some utility variables, _YES is optionally '--yes'
    [[ ! -z "$1" && "$1" == '--yes' ]] && _YES='--yes'
    _OS=$(lsb_release -is | awk '{ print tolower($0) }')
    [[ $_OS == 'pop' ]] && _OS='ubuntu'
    _REL=$(lsb_release -rs) # Release
    _CNM=$(lsb_release -cs) # CodeName
    _ARC=$(dpkg --print-architecture) # Architecture
    
    # The function that does the _Heavy Lifting_.
    # see the code that follows for the parameter signature
    function add_repo() {
        REPO_FQDN=$1 #'download.docker.com'
        GPG_KEY_URL=${2:-https:\/\/$REPO_FQDN\/gpg}
        GPG_KEY_PATH=/usr/share/keyrings/$REPO_FQDN.gpg
        REPO_ARCH=${3:-${_ARC}}
        [[ $REPO_ARCH == '-' ]] && REPO_ARCH='' || REPO_ARCH="arch=$REPO_ARCH"
        REPO_URL=${4:-https:\/\/$REPO_FQDN}
        REPO_SUITE=${5:-$_CNM}
        REPO_CMP=${6:-main}
        
        curl -fsSL $GPG_KEY_URL | sudo gpg --dearmor -o $GPG_KEY_PATH $_YES
        echo "Key created: $GPG_KEY_PATH"
        echo "deb [$(echo "$REPO_ARCH signed-by=$GPG_KEY_PATH" | xargs )] $REPO_URL $REPO_SUITE $REPO_CMP" | \
                    sudo tee /etc/apt/sources.list.d/$REPO_FQDN.list > /dev/null
        echo "APT source list added: /etc/apt/sources.list.d/$REPO_FQDN.list"
    }
    
    #Long line - 197 characters long
    #add_repo  REPO_FQDN/Name                GPG_KEY_URL                                             REPO_ARCH  REPO_URL                                         REPO_SUITE  REPO_CMP # TBD: PIN_PRIORITY
    #defaults: <required>                   'https://$REPO_FQDN/gpg'                                 $_ARC     'https://$REPO_FQDN'                              $_CNM      'main'    #      <optional>
    #         ----------------------------  ------------------------------------------------------- ---------- ------------------------------------------------ ----------- ---------
    # for: docker-ce docker-ce-cli containerd.io docker-compose-plugin
    # Also don't forget:
    #   remove: docker docker-engine docker.io containerd runc 
    #   possibly remove docker-compose and install: https://github.com/docker/compose-switch
    add_repo  'download.docker.com'         "https://download.docker.com/linux/$_OS/gpg"            ''         "https://download.docker.com/linux/$_OS"         ''          'stable'
    # for: anydesk
    add_repo  'deb.anydesk.com'             'https://keys.anydesk.com/repos/DEB-GPG-KEY'            '-'        'http://deb.anydesk.com/'                        'all'       ''
    # for: google-cloud-cli
    add_repo  'packages.cloud.google.com'   'https://packages.cloud.google.com/apt/doc/apt-key.gpg' '-'        'https://packages.cloud.google.com/apt'          'cloud-sdk' ''
    # for: code (optionally: powershell dotnet-*)
    add_repo  'packages.microsoft.com'      'https://packages.microsoft.com/keys/microsoft.asc'     ''         "https://packages.microsoft.com/$_OS/$_REL/prod" ''          ''
    # for: microsoft-edge-stable
    add_repo  'packages.microsoft.com-edge' 'https://packages.microsoft.com/keys/microsoft.asc'     ''         'http://packages.microsoft.com/repos/edge'       'stable'    ''
    # for: terraform
    add_repo  'apt.releases.hashicorp.com'  'https://apt.releases.hashicorp.com/gpg'                ''         'https://apt.releases.hashicorp.com'             ''          ''
    
    # I really LOVE xscreensavers, but it's been stuck in limbo on the
    # `stable` repos, so I install it from the `unstable`, aka `sid`, suite.
    # To do that safely, I make sure the repo is pinned to a lower priority.
    # I do this BEFORE I add the repo.
    
    # # Debian sid (unstable) as low-priority option
    (echo 'Package: *'; echo 'Pin: release a=unstable'; echo 'Pin-Priority: 200') | sudo tee /etc/apt/preferences.d/unstable > /dev/null
    # # pin xscreensaver to unstable
    (echo 'Package: xscreenaver*'; echo 'Pin: release a=unstable'; echo 'Pin-Priority: 2000') | sudo tee /etc/apt/preferences.d/xscreensaver > /dev/null
    
    # for: xscreensaver xscreensaver-data xscreensaver-data-extra
    #      xscreensaver-screensaver-bsod xscreensaver-screensaver-webcollage
    # Add the unstable/sid repo - THIS IS DANGEROUS without the pinning via
    # /etc/apt/preferences.d files created by the code above.
    sudo apt-add-repository $_YES --no-update "deb [arch=amd64] http://http.us.debian.org/debian sid main non-free contrib"
    
    # Finally, run `apt update` to check that everything completed successfully
    sudo apt update
    
    
    • 0

相关问题

  • 如何查看存档中可用的软件包的所有版本?

  • 是否可以说出我安装的哪些软件包不在原版安装中?

  • 从 Ubuntu 中完全删除密钥环是否安全?

  • 如何删除 PPA?

  • 使用 apt-get upgrade 时如何强制安装内核更新?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve