亚大伯斯 2026-02-05 18:45 采纳率: 98.3%
浏览 0
已采纳

Ubuntu系统中“有钱未托管”常见于APT源配置错误导致的包管理异常,如何修复?

Ubuntu系统中出现“有钱未托管”(实为中文误译,正确应为“**The repository is not signed / Release file is not signed**”或更常见的是 `NO_PUBKEY`、`GPG error: The following signatures couldn't be verified because the public key is not available` 等提示),本质是APT源配置错误导致的包管理异常——用户常将非官方、未导入GPG密钥的第三方源(如某些国内镜像误配、PPA路径错误、或手动添加了无签名的私有仓库)写入 `/etc/apt/sources.list` 或 `/etc/apt/sources.list.d/` 下,APT因无法验证签名而拒绝更新,终端误显乱码(如UTF-8解码异常时将“unsigned”“untrusted”等词错译为“有钱未托管”)。 修复方法: 1. 检查源配置:`grep -r "^deb" /etc/apt/sources.list*`; 2. 注释可疑第三方源(尤其无GPG密钥说明的); 3. 导入缺失密钥:`sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys `(Ubuntu 22.04+ 推荐改用 `gpg --dearmor` + `/usr/share/keyrings/` 方式); 4. 更新:`sudo apt update`。 根源在于源可信性与签名完整性,非字面“有钱”问题。
  • 写回答

1条回答 默认 最新

  • 秋葵葵 2026-02-05 18:46
    关注
    ```html

    一、现象层:终端误显“有钱未托管”——UTF-8解码失真下的语义幻觉

    该提示并非真实错误代码,而是APT在输出英文错误(如 The repository is not signedNO_PUBKEY 1234567890ABCDEF)时,因终端locale配置异常(如LANG=C混用UTF-8输出)、中文翻译包缺失或gettext模板错位,将unsigned音近误译为“有钱”、untrusted形近错解为“未托管”。此属典型的本地化层故障,掩盖了底层安全验证失败的本质。

    二、机制层:APT信任链与Debian/Ubuntu软件分发安全模型

    APT采用基于GPG的强签名验证机制:每个仓库必须提供InRelease(内联签名)或Release+Release.gpg(分离签名)文件;客户端需预置对应公钥于/etc/apt/trusted.gpg(旧式)或/usr/share/keyrings/*.asc(新式)。一旦签名验证失败(密钥缺失、过期、吊销或Release文件被篡改),APT即中止更新并抛出GPG错误——这是设计使然,而非缺陷。

    三、溯源层:四类高频诱因与配置痕迹诊断表

    诱因类型典型配置路径可观察线索风险等级
    国内镜像源误配/etc/apt/sources.list.d/tsinghua.listdeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ...但无配套keyring导入★★★☆
    PPA路径拼写错误/etc/apt/sources.list.d/ondrej-ubuntu-php-jammy.list实际应为ondrej/php,导致404后APT尝试解析空Release文件★★★★
    私有仓库未签名/etc/apt/sources.list.d/internal-repo.list使用http://intranet/repo且无[arch=amd64 trusted=yes]绕过检查★★★★★
    密钥过期未轮转/usr/share/keyrings/ubuntu-archive-keyring.gpgapt updateEXPKEYSIG而非NO_PUBKEY★★★

    四、诊断层:结构化排障流程(Mermaid流程图)

    
    flowchart TD
        A[执行 sudo apt update] --> B{是否出现 GPG 错误?}
        B -->|否| C[检查网络/DNS/代理]
        B -->|是| D[提取错误中的 KEYID:NO_PUBKEY ABCDEF1234567890]
        D --> E[运行 apt-key list | grep ABCDEF]
        E -->|存在| F[检查密钥有效期与签名链]
        E -->|不存在| G[确认源URL有效性 + 检查 /etc/apt/sources.list*]
        G --> H[定位含该KEYID的deb行]
        H --> I[注释该行或补全keyring导入]
    

    五、修复层:面向Ubuntu 22.04+的现代密钥管理实践

    摒弃已废弃的apt-key add(因其污染全局信任库),采用隔离式密钥挂载:

    1. 下载密钥:curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/cloud-google-keyring.gpg
    2. 声明源时绑定密钥:deb [arch=amd64 signed-by=/usr/share/keyrings/cloud-google-keyring.gpg] https://packages.cloud.google.com/apt cloud-sdk main
    3. 验证签名完整性:apt-get install -y debian-keyring && debsig-verify /var/cache/apt/archives/*.deb 2>/dev/null | head -5

    六、加固层:自动化防护与CI/CD集成建议

    在运维流水线中嵌入APT源健康检查:

    • 使用apt-config dump | grep Acquire::https::Verify-Peer确保TLS证书校验开启
    • 通过apt-cache policy交叉比对各源优先级与可信状态
    • 在Ansible Playbook中加入apt_repository模块的filenamekeyring参数强制声明
    • 定期扫描/etc/apt/sources.list.d/*.list中非archive.ubuntu.comsecurity.ubuntu.com域名的HTTP源(禁用明文传输)

    七、认知层:超越“修错”的安全治理视角

    “有钱未托管”本质是组织软件供应链治理能力的镜像投射——它暴露的是缺乏统一源策略(如Nexus/Aptly网关)、缺少密钥生命周期管理(生成→分发→轮转→吊销)、以及开发环境与生产环境源配置不一致等系统性风险。资深工程师应推动建立sources-as-code仓库,配合Conftest策略引擎校验APT源合规性(例如:禁止HTTP、要求signed-by字段、密钥指纹白名单)。

    ```
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 今天
  • 创建了问题 2月5日