Ubuntu 20.04安装ROS Noetic时GPG密钥报错的终极解决指南
当你满怀期待地在Ubuntu 20.04上安装ROS Noetic,准备开启机器人开发之旅时,终端突然跳出"仓库没有数字签名"的红色警告,这种挫败感我深有体会。别担心,这并非你的操作失误,而是APT包管理器在尽职尽责地保护你的系统安全。本文将带你深入理解这个常见问题的本质,并手把手教你两种经过验证的解决方案。
1. 理解GPG密钥验证机制
现代Linux发行版如Ubuntu采用了一套严格的安全机制来确保软件来源的可信度。当你执行sudo apt update时,系统会做以下几件事:
- 从配置的软件源下载
Release和Release.gpg文件 - 使用预先配置的GPG公钥验证这些文件的签名
- 只有验证通过的软件源才会被信任
ROS Noetic的安装过程中,关键一步就是添加其官方GPG密钥到系统的信任列表中。如果这一步出现问题,后续的安装就会遇到"没有数字签名"的报错。
常见报错示例:
E: 仓库 "http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu focal Release" 没有数字签名。 N: 无法安全地用该源进行更新,所以默认禁用该源。这个错误的核心原因是系统无法验证ROS软件仓库的完整性,因此出于安全考虑拒绝使用该源。
2. 方法一:手动下载并添加GPG密钥文件
这是官方推荐的方法,虽然步骤稍多,但成功率最高。我将在下面详细说明每个步骤及其背后的原理。
2.1 获取正确的GPG密钥
首先,我们需要获取ROS官方使用的GPG密钥。这个密钥的ID是0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654。
你可以通过以下两种方式获取密钥内容:
直接访问Ubuntu密钥服务器:
curl -sSL http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654或者使用以下命令从备用服务器获取:
gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
2.2 创建并验证密钥文件
将获取到的密钥内容保存为ros.asc文件。你可以使用任意文本编辑器创建这个文件,但需要注意:
- 必须包含完整的密钥信息,包括
-----BEGIN PGP PUBLIC KEY BLOCK-----和-----END PGP PUBLIC KEY BLOCK-----这两行 - 文件保存为纯文本格式,不要有多余的格式或隐藏字符
验证文件内容是否正确:
file ros.asc应该显示ASCII text。
2.3 添加密钥到APT信任列表
现在,我们将这个密钥添加到系统的APT信任列表中:
sudo apt-key add ros.asc如果一切顺利,你会看到类似OK的输出,表示密钥已成功添加。
注意:在某些系统配置下,你可能需要先切换到root用户才能执行此操作。可以使用
sudo -i进入root shell后再执行上述命令。
2.4 验证修复效果
完成上述步骤后,再次运行更新命令:
sudo apt update这次你应该不会再看到关于数字签名的错误了。如果仍然有问题,可以尝试清除APT缓存:
sudo apt clean sudo rm -rf /var/lib/apt/lists/* sudo apt update3. 方法二:使用替代密钥服务器
如果方法一因网络问题无法正常工作,我们可以尝试使用不同的密钥服务器或命令格式。这种方法在某些网络环境下更为可靠。
3.1 尝试不同的密钥服务器
Ubuntu支持多个密钥服务器,如果默认的keyserver.ubuntu.com不可用,可以尝试:
sudo apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654或者使用香港的镜像服务器:
sudo apt-key adv --keyserver hkp://hkps.pool.sks-keyservers.net:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C6543.2 使用完整的密钥添加命令
有时,更完整的命令格式能解决网络问题:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654这个命令会:
- 连接到Ubuntu的密钥服务器
- 下载指定ID的公钥
- 自动将其添加到APT的信任列表中
3.3 验证密钥是否添加成功
无论使用哪种方法,添加完成后都应该验证密钥是否存在:
apt-key list | grep "ROS"你应该能看到类似这样的输出:
pub rsa2048 2014-07-19 [SC] C1CF 6E31 E6BA DE88 68B1 72B4 F42E D6FB AB17 C654 uid [ unknown] Open Robotics <info@osrfoundation.org>4. 常见问题与解决方案
在实际操作中,你可能会遇到一些特殊情况。下面是我总结的几个常见问题及其解决方法。
4.1 权限问题
当执行apt-key add时,可能会遇到权限不足的错误。这时可以:
使用
sudo提升权限:sudo apt-key add ros.asc或者切换到root用户:
sudo -i apt-key add ros.asc exit
重要:操作完成后记得退出root会话,避免意外执行危险命令。
4.2 网络连接问题
如果密钥服务器无法访问,可以尝试:
- 检查网络连接是否正常
- 尝试不同的DNS服务器(如8.8.8.8或1.1.1.1)
- 等待一段时间后重试,可能是服务器临时不可用
4.3 密钥格式错误
如果遇到"找不到有效的OpenPGP数据"错误,可能是密钥文件格式有问题。解决方法:
- 重新下载密钥文件,确保没有多余的空格或换行
- 检查文件编码是否为纯ASCII
- 尝试从不同来源获取密钥
5. 深入理解APT安全机制
为了更好地预防类似问题,了解APT的工作原理很有帮助。APT使用GPG密钥来验证软件包的真实性,这个过程包括:
- 软件源配置:
/etc/apt/sources.list或/etc/apt/sources.list.d/中的文件定义了软件源 - Release文件:包含软件源的元数据和校验和
- Release.gpg:Release文件的数字签名
- 密钥环:
/etc/apt/trusted.gpg.d/中的密钥用于验证签名
当这个链条中的任何一环出现问题时,就会导致验证失败。理解这一点有助于你更快地诊断和解决类似问题。