GitLab密钥过期别慌!手把手教你Ubuntu 22.04上两种方法(apt-key vs signed-by)修复EXPKEYSIG错误
GitLab密钥过期实战指南Ubuntu 22.04两种修复方案深度解析当你在Ubuntu 22.04上执行apt update时突然看到那个令人不安的红色错误提示The following signatures were invalid: EXPKEYSIG 3F01618A51312F3F GitLab B.V.这就像系统管理员版的蓝屏时刻。别担心这实际上是GitLab仓库签名密钥过期的常见问题而我将带你深入理解背后的机制并提供两种可靠的解决方案。1. 理解EXPKEYSIG错误的本质那个看似晦涩的EXPKEYSIG错误实际上是Ubuntu的APT包管理系统在告诉你嘿我无法验证这个软件包的来源是否可信。就像你收到一封声称来自银行的邮件但签名已经过期无法验证一样。密钥过期的核心原因GitLab用于签署软件仓库的GPG密钥有固定有效期通常2年虽然GitLab可能延长了密钥有效期但你的本地系统并不知道这个更新APT会严格检查签名有效性拒绝任何过期或无效的签名在终端中完整的错误信息通常如下Err:36 https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu focal InRelease The following signatures were invalid: EXPKEYSIG 3F01618A51312F3F GitLab B.V.有趣的是这个错误实际上证明了APT的安全机制在正常工作它阻止了你从可能不安全的源安装软件。2. 诊断你的系统配置在开始修复之前我们需要确定你的系统使用的是哪种密钥管理方式。Ubuntu/Debian系统近年来从传统的apt-key方法过渡到了更安全的signed-by方式。2.1 检查当前密钥管理方式打开终端执行以下命令grep deb \[signed-by /etc/apt/sources.list.d/gitlab_gitlab-*.list结果解读无输出你的系统使用传统的apt-key方法有输出显示类似deb [signed-by/usr/share/keyrings/gitlab-archive-keyring.gpg]的内容表示使用signed-by方法2.2 验证当前密钥状态无论哪种方法都可以先检查现有GitLab密钥apt-key list | grep -A1 GitLab B.V.或对于signed-by系统gpg --list-keys --keyring /usr/share/keyrings/gitlab-archive-keyring.gpg3. 方案一传统apt-key修复方法如果你的系统仍在使用apt-keyUbuntu 22.04默认已弃用但可能仍有遗留配置以下是详细修复步骤3.1 删除过期密钥首先移除已过期的密钥sudo apt-key del 3F01618A51312F3F注意如果提示未找到密钥可能是因为密钥指纹格式不同尝试sudo apt-key list | grep -B1 GitLab | grep -oE [0-9A-F]{16} | xargs -I {} sudo apt-key del {}3.2 下载并添加新密钥从GitLab官方获取最新密钥并添加到系统中curl -s https://packages.gitlab.com/gpg.key | sudo apt-key add -3.3 验证密钥添加成功检查新密钥是否已正确添加apt-key list | grep -A1 GitLab B.V.你应该能看到新的有效期日期通常为2026年。4. 方案二现代signed-by修复方法对于使用signed-by指定密钥路径的新式配置推荐修复流程略有不同4.1 定位密钥文件位置首先找出GitLab密钥的存储路径awk /deb \[signed-by/{ pubkey $2; sub(/\[signed-by/, , pubkey); sub(/\]$/, , pubkey); print pubkey } /etc/apt/sources.list.d/gitlab_gitlab-*.list典型路径可能是/usr/share/keyrings/gitlab-archive-keyring.gpg4.2 更新密钥文件使用以下命令更新密钥文件curl -s https://packages.gitlab.com/gpg.key | sudo gpg --dearmor /usr/share/keyrings/gitlab-archive-keyring.gpg4.3 验证密钥更新检查新密钥的有效期gpg --list-keys --keyring /usr/share/keyrings/gitlab-archive-keyring.gpg5. 两种方法的深度对比与选择建议为了帮助你选择最适合的方法以下是关键对比特性apt-key方法signed-by方法安全性较低系统级信任较高仓库级信任维护性较难管理更易维护Ubuntu 22.04支持度已弃用官方推荐复杂度较简单稍复杂未来兼容性可能停止支持长期支持个人建议如果是临时修复两种方法都可以如果是新系统或长期维护强烈建议迁移到signed-by方法生产环境应考虑完全切换到signed-by以获得更好的安全性6. 验证修复效果与后续步骤完成上述任一方法后执行以下命令验证sudo apt update如果一切正常你应该不再看到EXPKEYSIG错误而是正常的更新过程。常见问题排查如果仍然报错尝试清除APT缓存sudo apt clean sudo rm -rf /var/lib/apt/lists/* sudo apt update确保你的系统时间正确错误的日期也会导致签名验证失败date # 检查当前时间 sudo apt install ntpdate # 如果需要时间同步 sudo ntpdate pool.ntp.org7. 预防措施与最佳实践为了避免未来再次遇到类似问题可以考虑以下预防措施定期检查密钥有效期# 对于apt-key apt-key list | grep -A1 expired # 对于signed-by find /usr/share/keyrings/ -name *.gpg -exec gpg --list-keys --keyring {} \;设置监控警报将密钥检查加入你的常规系统监控中考虑使用本地镜像对于企业环境可以设置内部镜像并自行管理密钥文档记录为你的团队记录密钥更新流程节省下次解决问题的时间在管理多个Ubuntu系统的实践中我发现建立一个简单的定期检查脚本可以提前发现这类问题。例如每月运行一次密钥检查并在到期前30天发出警告。