此前我们讨论过 PPA ,PPA 允许应用程序开发者和 Linux 用户创建自己的软件源来分发软件,但保存软件包的服务器在 Ubuntu。
作为开发者,你可能会想有没有一种方式可以不用提交软件包到 Ubuntu 官方托管的 PPA,而是让用户直接从自己的服务器下载安装又能提供使用 Apt 包管理器升级的方案。
我们知道 APT 包管理器仅可以允许你在本地或者 Ubuntu 的软件源安装软件。但是要从个人开发者服务器安装软件就必须建立一种安全的通讯机制。
在 Linux 内置一种安全的机制称为 GPG,全称是 GNU Privacy Guard。GPG 是一种用于数字签名和加密的加密工具,它可以保证你安装的软件包是来自开发者。
本教程中,你不需要完全理解 GPG,但需要你有这样的一个概念。我们仅说明如何在 Ubuntu 启用外部的软件源并使用 APT 安装软件包的整个过程。
了解外部软件源安装过程
在继续之前,我强烈建议您阅读这两篇文章,以便您更清楚地了解事情:
快速回忆一下,这是 Linux 软件仓库和包管理器的直观表示。
从上图可以看出,我们向系统添加一个新的外部软件源。这样,您就可以从这个新软件源下载并安装可用的软件包。
如果软件源提供软件包版本的更新,您可以将已安装的软件包与系统更新一起进行更新运行命令 apt update && apt upgrade
。
那么我们如何再添加一个外部的软件源,我们将在下面的教程中详细描述添加外部软件源的整个过程。
让 APT 支持 HTTPS
如果你经常使用 APT 安装软件包并且查看这个安装过程日志,你可能会发现 Ubuntu 官方的软件源都不是使用 HTTPS 协议传输数据。
因为历史问题, APT 包管理器默认不支持 HTTPS 协议。由于外部软件源使用的是 HTTPS 加密协议传输数据。
因此你需要使 APT 包管理器支持 HTTPS 协议数据传输,则需要安装 apt-transport-https 软件包,运行命令 sudo apt install apt-transport-https
。
sudo apt install apt-transport-https curl
下面是我们在 Ubuntu 20.04 运行 apt update
命令打印的日志,你可以看到 Docker 软件软件源 URL 是 HTTPS 协议,Ubuntu 软件源和 PPA 则使用 HTTP。
Hit:1 https://download.docker.com/linux/ubuntu focal InRelease
Hit:2 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal InRelease
Hit:6 http://packages.microsoft.com/repos/code stable InRelease
Hit:3 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates InRelease
Hit:7 https://dl.google.com/linux/chrome/deb stable InRelease
Hit:4 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-backports InRelease
Hit:5 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-security InRelease
其实在 APT 包管理器在 1.5 之后的版本就不需要 apt-transport-https 软件包的支持,因此您不再需要安装 apt-transport-https。
您在这里看到我们提到了这个包。这更多是出于遗留原因。如果你使用的是旧版本 APT 或者非常旧的发行版本则需要安装它。
现在,你大概也知道为什么 Ubuntu 软件源和 PPA 使用的是 HTTP ,而不是 HTTPS 加密协议。
你可能认为,既然 HTTPS 是加密的安全协议,则可以不需要 GPG 这种机制。答案是否定的。虽然 HTTPS 提供传输过程的安全,但不能保证软件包来自开发者。
添加外部软件源的 GPG 密钥
如引言所提到的,GPG 是一种用于数字签名和加密的加密工具。它用于验证软件源的软件包是否经过认证和未被篡改。
每个软件源都有一个相应的 GPG 密钥,用于对软件包进行签名。通过添加 GPG 密钥,您可以确保从软件源下载的软件包是由可信的源发布的,并且没有被恶意篡改。这可以保护您的系统免受恶意软件或不受信任的软件源的影响。
在添加软件源时,Ubuntu 会检查软件源的 GPG 密钥是否存在并且与软件源本身匹配。如果 GPG 密钥不匹配,系统将抛出错误 GPG 签名错误:
GPG error: The following signatures couldn’t be verified
防止您从不受信任的软件源安装软件包。因此,添加 GPG 密钥是一个安全措施,确保您从可信任的软件源下载并安装软件包,提高系统的安全性和稳定性。
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
下载的密钥可以运行命令 apt-key add
将密钥添加到系统。这是将 GPG 密钥添加到系统的其中一种方法。
您也会看到一些不同的命令,它们可能看起来略有不同,但执行相同的工作,都是将软件源密钥添加到你的系统。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
当 GPG 密钥添加到系统之后,你可以运行命令 apt-key list
查看系统已添加软件源的 GPG 密钥。
sudo apt-key list
.......
/etc/apt/trusted.gpg.d/google-chrome.gpg
----------------------------------------
pub rsa4096 2016-04-12 [SC]
EB4C 1BFD 4F04 2F6D DDCC EC91 7721 F63B D38B 4796
uid [ unknown] Google Inc. (Linux Packages Signing Authority) <linux-packages-keymaster@google.com>
sub rsa4096 2021-10-26 [S] [expires: 2024-10-25]
sub rsa4096 2023-02-15 [S] [expires: 2026-02-14]
......
添加外部软件源到源列表
现在我们已经添加软件源的 GPG 密钥到系统,接下来就是在系统的源列表添加外部的软件源记录。这样,您的系统就会知道它必须检查此软件源软件包和更新。
要将外部软件源添加 Ubuntu 系统或者基于 Debian 的发行版,可以有两种不同的方式,第一种直接在 /etc/apt/sources.list 文件添加软件源的记录。
另外一种方式在 /etc/apt/sources.list.d/ 创建以 .list 作为扩展名的文件,为了方便记忆,文件名称通常是软件包的名称。
通常我们建议使用第二种方式,这使得包管理变得更加容易。如果要从系统中删除软件源,只需删除相应的源文件即可。无需修改 sources.list 文件。
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee -a /etc/apt/sources.list.d/yarn.list
使用 APT 安装外部软件源的软件包
现在,您已将软件源的 GPG 密钥和软件源的 URL 添加到系统。但您的系统仍然不知道这个软件源保存的包。
因此你需要首先运行命令 sudo apt update 更新包元数据的本地缓存。完成后,您的系统将会保存外部软件源可用的软件包的信息。
sudo apt update
sudo apt install yarn
结论
至此,你已了解 GPG 密钥的作用以及在添加外部软件源的整个过程的运行原理,如果您有任何疑问或建议,请随时在下方留言。