Ubuntu 18.04 ROS安装遇坑记:手把手教你修复‘EXPKEYSIG’签名无效错误
Ubuntu 18.04 ROS安装遇坑记:手把手教你修复‘EXPKEYSIG’签名无效错误
第一次在Ubuntu上安装ROS时,那种兴奋感很快被终端里鲜红的错误提示浇灭——EXPKEYSIG F42ED6FBAB17C654。作为机器人开发的基础环境,ROS的安装本应是入门第一步,却让无数开发者在这个密钥验证错误前折戟。这就像拿到了新玩具却发现电池仓上了锁,而钥匙却不知所踪。
1. 理解GPG密钥在ROS安装中的作用
当你执行sudo apt update时,系统会做一件至关重要的事:验证软件源的完整性。Ubuntu使用GPG(GNU Privacy Guard)密钥来确认下载的软件包列表确实来自官方源,而非被篡改的版本。这就好比网购时验证商家资质,确保不会收到山寨货。
ROS作为第三方软件源,需要额外导入其官方密钥。常见的密钥问题通常表现为三种错误:
- EXPKEYSIG:密钥已过期(本文重点解决的问题)
- NO_PUBKEY:密钥未导入
- BADSIG:密钥不匹配或被篡改
为什么密钥会过期?Open Robotics等组织出于安全考虑,会定期轮换密钥。如果本地系统长时间未更新,就可能遇到过期密钥报错。这就好比你拿着过期的会员卡去超市,收银员当然会拒绝优惠请求。
2. 诊断密钥问题的具体原因
遇到EXPKEYSIG错误时,终端通常会显示类似这样的信息:
W: GPG error: http://packages.ros.org/ros/ubuntu bionic InRelease: The following signatures were invalid: EXPKEYSIG F42ED6FBAB17C654 Open Robotics <info@osrfoundation.org>关键信息提取:
- 密钥ID:
F42ED6FBAB17C654 - 密钥所有者:Open Robotics
- 问题类型:EXPKEYSIG(过期)
验证当前密钥状态:
apt-key list | grep -A5 "Open Robotics"如果输出中包含expired字样,即可确认是密钥过期问题。有时候问题可能更复杂,比如:
- 多个密钥冲突
- 密钥服务器连接问题
- 系统时间不正确(GPG验证依赖准确的时间)
提示:遇到密钥问题时,先检查系统时间是否正确。执行
date命令查看,如果偏差较大,先用sudo ntpdate pool.ntp.org同步时间。
3. 分步修复EXPKEYSIG错误
3.1 删除旧密钥(如有必要)
首先查看现有密钥:
sudo apt-key list如果发现过期密钥,可以先删除:
sudo apt-key del F42ED6FBAB17C6543.2 从可靠密钥服务器获取新密钥
使用apt-key adv命令获取新密钥:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys F42ED6FBAB17C654参数解析:
--keyserver:指定密钥服务器(hkp协议默认使用11371端口)--recv-keys:指定要获取的密钥ID
如果默认服务器响应慢,可以尝试备用服务器:
sudo apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys F42ED6FBAB17C654常见可用密钥服务器:
| 服务器地址 | 地理位置 | 协议端口 |
|---|---|---|
| keyserver.ubuntu.com | 全球 | hkp:11371 |
| pgp.mit.edu | 美国 | hkp:11371 |
| keys.gnupg.net | 欧洲 | hkp:11371 |
| pool.sks-keyservers.net | 全球池 | hkp:11371 |
3.3 验证密钥导入成功
检查新密钥:
apt-key list | grep -A5 "Open Robotics"正常输出应显示密钥信息且无"expired"标记。例如:
pub rsa2048 2018-04-16 [SC] [expires: 2025-04-14] F42E D6FB AB17 C654 uid [ unknown] Open Robotics <info@osrfoundation.org> sub rsa2048 2018-04-16 [E] [expires: 2025-04-14]3.4 更新软件源缓存
最后执行更新:
sudo apt update此时应该不再出现EXPKEYSIG错误,ROS软件源可以正常更新。
4. 深入理解密钥管理机制
4.1 APT与GPG的工作流程
当执行apt update时,系统会:
- 下载InRelease或Release.gpg文件
- 用本地密钥环中的公钥验证签名
- 只有验证通过的软件源才会被信任
这个过程确保了:
- 完整性:软件包未被篡改
- 真实性:确实来自声称的发布者
- 新鲜度:使用的是最新软件列表
4.2 现代替代方案:signed-by
较新的Ubuntu版本推荐使用signed-by替代直接操作apt-key:
sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'这种方法将密钥存储在单独文件而非全局密钥环中,更安全且易于管理。
4.3 密钥过期的预防措施
为避免将来再遇密钥问题:
- 定期检查密钥有效期:
apt-key list | grep -A5 "expires" - 关注ROS官方公告
- 设置自动更新(谨慎使用):
sudo apt install unattended-upgrades sudo dpkg-reconfigure unattended-upgrades
5. 进阶:处理特殊网络环境下的密钥问题
在某些网络环境下,可能会遇到连接密钥服务器超时的问题。这时可以尝试:
5.1 使用HTTP代替HKP协议
sudo apt-key adv --keyserver http://keyserver.ubuntu.com --recv-keys F42ED6FBAB17C6545.2 手动下载并导入密钥
- 从浏览器访问:
https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xF42ED6FBAB17C654 - 保存为ros-key.asc
- 导入:
sudo apt-key add ros-key.asc
5.3 使用备用端口
有些网络可能屏蔽了11371端口,尝试80端口:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys F42ED6FBAB17C6546. 常见问题排查指南
遇到问题不要慌,按这个检查表逐步排查:
错误是否明确显示EXPKEYSIG?
- 是:按本文方法处理
- 否:可能是其他类型密钥问题
密钥服务器能否连通?
telnet keyserver.ubuntu.com 11371或
curl http://keyserver.ubuntu.com:11371系统时间是否正确?
timedatectl status是否有防火墙干扰?
sudo ufw status是否使用了代理?
env | grep -i proxy
注意:处理密钥问题时,切勿随意从不可信来源获取密钥。始终通过官方渠道或知名密钥服务器获取密钥。
7. ROS生态中的密钥管理最佳实践
在长期使用ROS的过程中,我总结了这些经验:
版本升级时:每次Ubuntu或ROS版本升级后,检查密钥是否需要更新
团队协作时:将正确的源配置和密钥管理写入团队文档
持续集成系统中:在CI脚本中加入密钥验证步骤
多机环境:使用Ansible等工具统一管理密钥配置
一个实用的检查脚本:
#!/bin/bash KEY_ID="F42ED6FBAB17C654" if ! apt-key list | grep -q "$KEY_ID"; then echo "导入ROS密钥..." sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys "$KEY_ID" fi sudo apt update8. 密钥问题背后的安全哲学
这个看似简单的密钥错误,实际上体现了Linux系统安全设计的精髓:
- 不信任原则:默认不信任任何外部源
- 最小权限原则:即使安装软件也需要明确授权
- 透明性原则:所有验证过程都可查证
- 可审计性:每一步操作都有日志记录
理解这些原则,就能明白为什么Linux系统宁愿报错中断,也不冒险使用未经验证的软件源。这种设计虽然有时带来不便,但正是它保证了系统长期运行的稳定性。
