nvdia@nvdia-desktop:~/Desktop$ sudo apt-key list | grep "871920D1991BC93C" Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
时间: 2025-06-06 17:01:28 浏览: 9
<think>我们面临两个主要问题:1.NO_PUBKEY871920D1991BC93C错误2.NVIDIAJetson仓库的GPG密钥存储在legacytrusted.gpg中的警告(即将迁移到/etc/apt/trusted.gpg.d/)解决方案分为两部分:第一部分:解决缺失的Ubuntu公钥(NO_PUBKEY871920D1991BC93C)第二部分:将NVIDIA仓库的密钥从legacytrusted.gpg迁移到/etc/apt/trusted.gpg.d/注意:自Ubuntu20.04起,推荐使用signed-by方式指定密钥,而apt-key方式已被弃用。具体步骤:第一部分:添加缺失的Ubuntu公钥步骤1:通过keyserver获取公钥我们可以使用gpg命令从Ubuntu密钥服务器下载公钥,并保存到/usr/share/keyrings/目录(推荐位置)。执行以下命令:$sudogpg--no-default-keyring--keyring/usr/share/keyrings/ubuntu-ports-keyring.gpg--keyserverkeyserver.ubuntu.com--recv-keys871920D1991BC93C说明:-`--no-default-keyring`:不使用默认密钥环-`--keyring`:指定新的密钥环文件(我们将密钥保存到`/usr/share/keyrings/ubuntu-ports-keyring.gpg`)-`--recv-keys`:指定要接收的密钥ID步骤2:修改权限以确保安全$sudochmod644/usr/share/keyrings/ubuntu-ports-keyring.gpg步骤3:验证密钥是否成功添加$gpg--no-default-keyring--keyring/usr/share/keyrings/ubuntu-ports-keyring.gpg--list-keys应该看到包含871920D1991BC93C的密钥。步骤4:更新APT仓库配置我们需要在相应的仓库配置文件中添加`signed-by`选项,指向我们刚添加的密钥环文件。首先,找到定义Ubuntu仓库的文件。通常,这些仓库定义在`/etc/apt/sources.list`或`/etc/apt/sources.list.d/`下的某个文件中。例如,在`/etc/apt/sources.list`中,可能有如下行:debhttp://ports.ubuntu.com/ubuntu-portsjammymainuniverse修改为:deb[signed-by=/usr/share/keyrings/ubuntu-ports-keyring.gpg]http://ports.ubuntu.com/ubuntu-portsjammymainuniverse同样,对jammy-updates和jammy-security进行同样的修改。注意:如果你在独立的文件中配置了这些仓库,请修改相应文件。步骤5:更新APT索引$sudoaptupdate此时,关于Ubuntu仓库的NO_PUBKEY错误应该已经解决。第二部分:迁移NVIDIAJetson仓库密钥当前警告:NVIDIA仓库的密钥存储在旧格式的`/etc/apt/trusted.gpg`中。建议将其迁移到`/etc/apt/trusted.gpg.d/`目录下的独立文件。步骤1:导出现有的NVIDIA密钥首先,我们需要从旧格式的trusted.gpg中导出NVIDIA仓库的密钥。使用以下命令列出当前信任的所有密钥:$sudoapt-keylist在输出中查找与NVIDIA仓库相关的密钥。通常描述中会有“NVIDIACorporation”或类似字样。记下密钥ID(例如:abcd1234...)。假设我们找到的密钥ID是:abcd1234步骤2:导出密钥到文件将密钥导出到临时文件:$sudoapt-keyexportabcd1234|sudogpg--dearmour-o/etc/apt/trusted.gpg.d/nvidia-keyring.gpg说明:-`apt-keyexport`输出密钥的二进制形式-`gpg--dearmour`将其转换为gpg格式(ASCIIarmored格式的相反操作,这里我们输出为二进制格式,但也可以输出为ASCII格式,但推荐二进制,因为扩展名.gpg通常用于二进制)注意:实际上,`--dearmour`用于将ASCII格式转换为二进制,但此处我们使用`-o`直接输出二进制。另一种做法是导出为ASCII格式(扩展名.asc):但为了统一,我们将二进制格式的密钥环文件保存为`/etc/apt/trusted.gpg.d/nvidia-keyring.gpg`。步骤3:删除旧密钥(可选,但推荐)一旦我们确认新密钥文件可用,就可以从旧密钥环中删除NVIDIA的密钥:$sudoapt-keydelabcd1234注意:请确保新密钥已经正确导出并且已经存放在`trusted.gpg.d`目录下再执行删除。步骤4:修改NVIDIA仓库配置文件在NVIDIA仓库的源文件中(可能在`/etc/apt/sources.list.d/`下的`nvidia-l4t-apt-source.list`或类似文件),添加`signed-by`选项。例如,原文件内容可能是:debhttps://repo.download.nvidia.com/jetson/commonr34.1main修改为:deb[signed-by=/etc/apt/trusted.gpg.d/nvidia-keyring.gpg]https://repo.download.nvidia.com/jetson/commonr34.1main对于另一个仓库(如t234)同样处理。步骤5:更新APT并验证$sudoaptupdate现在,关于NVIDIA仓库的警告应该消失。其他注意事项:1.如果apt-keylist中除了NVIDIA还有其他第三方密钥,建议都迁移到`trusted.gpg.d`目录,并用signed-by指向。2.如果迁移后出现任何问题,可以暂时删除新添加的密钥文件并重新用apt-key添加,然后再重新迁移。常见问题:问:如果找不到对应的仓库配置文件怎么办?答:使用命令`grep-r"repo.download.nvidia.com"/etc/apt/`来定位配置文件。问:如果导出的密钥不起作用怎么办?答:可以尝试从NVIDIA官网下载新的密钥文件。通常,仓库会提供下载密钥的方法。例如,使用curl下载:$curl-sSLhttps://repo.download.nvidia.com/jetson/common/KEY.gpg|sudogpg--dearmour-o/etc/apt/trusted.gpg.d/nvidia-official-keyring.gpg然后同样在sources.list.d的配置文件中添加signed-by引用。最后,更新apt缓存并升级:$sudoaptupdate&&sudoaptupgrade希望这些步骤能解决您的问题。相关问题:1.如何验证GPG密钥的指纹?2.当添加多个仓库时,如何管理不同的GPG密钥?3.如何解决迁移后APT仍然报密钥警告的问题?</think>
### 解决 Ubuntu APT 公钥缺失与密钥迁移问题
您面临两个核心问题:
1. `NO_PUBKEY 871920D1991BC93C`错误(Ubuntu官方仓库验证失败)
2. NVIDIA Jetson 仓库密钥存储位置警告(需迁移到新格式)
以下是详细的解决方案:
---
#### **第一步:修复 Ubuntu 仓库的公钥缺失问题**
1. **从密钥服务器获取公钥**
```bash
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/ubuntu-ports-keyring.gpg \
--keyserver keyserver.ubuntu.com --recv-keys 871920D1991BC93C
```
- 密钥服务器端口支持:`80`(HTTP)/`443`(HTTPS),若受阻可尝试:
`hkps://keyserver.ubuntu.com:443` 或 `hkp://pgp.mit.edu:80`
2. **设置文件权限**
```bash
sudo chmod 644 /usr/share/keyrings/ubuntu-ports-keyring.gpg
```
3. **更新仓库配置**
```bash
sudo sed -i "s|deb http://ports.ubuntu.com|deb [signed-by=/usr/share/keyrings/ubuntu-ports-keyring.gpg] http://ports.ubuntu.com|g" \
/etc/apt/sources.list /etc/apt/sources.list.d/*.list
```
- 此命令在所有仓库定义中添加 `signed-by` 参数
4. **验证修复**
```bash
sudo apt update # 应不再显示 NO_PUBKEY 错误
```
---
#### **第二步:迁移 NVIDIA Jetson 仓库密钥**
1. **定位现有密钥ID**
```bash
sudo apt-key list | grep -B 1 'repo.download.nvidia.com'
```
- 输出示例:
```
pub rsa4096 2021-03-10 [SC]
ABCD1234EFGH5678IJKL9012MNOP3456QRST7890
```
2. **导出密钥到新位置**
```bash
sudo apt-key export ABCD1234... | \
sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/nvidia-jetson.gpg
```
3. **更新 NVIDIA 仓库配置**
```bash
sudo nano /etc/apt/sources.list.d/nvidia-l4t-apt-source.list
```
修改每行仓库地址为:
```diff
- deb https://repo.download.nvidia.com/jetson/... ...
+ deb [signed-by=/etc/apt/trusted.gpg.d/nvidia-jetson.gpg] https://repo.download.nvidia.com/jetson/... ...
```
4. **清理旧密钥(可选)**
```bash
sudo apt-key del ABCD1234... # 确保新配置生效后再执行
```
---
#### **第三步:完整验证**
```bash
sudo apt clean
sudo rm -rf /var/lib/apt/lists/*
sudo apt update # 应无任何警告或错误
sudo apt upgrade
```
---
### **技术原理说明**
1. APT 验证时验证签名关系:
$$ \text{签名} \equiv \text{私钥加密}(\text{仓库元数据}) $$
客户端用公钥解密验证[^1]
2. 密钥迁移本质是将二进制密钥从联合存储(trusted.gpg)分离为独立文件(trusted.gpg.d),解决密钥冲突问题
3. `signed-by` 参数实现密钥与仓库的精确绑定[^2]
---
### **相关问题**
1. 如何验证 GPG 密钥的指纹是否匹配官方来源?
2. 当 apt-key 完全弃用后应该如何管理第三方仓库密钥?
3. 如何为私有仓库创建自签名 GPG 密钥对?
4. 为什么某些防火墙环境需要特殊配置才能访问密钥服务器?
[^1]: APT 使用 OpenPGP 标准验证包完整性(RFC4880)
[^2]: Debian 政策手册规定 per-repository 密钥管理要求
阅读全文
相关推荐



















