Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)). Executing: /tmp/apt-key-gpghome.fIXhNkCeUz/gpg.1.sh --keyserver keyserver.ubuntu.com --recv-keys 871920D1991BC93C gpg: key 871920D1991BC93C: public key "Ubuntu Archive Automatic Signing Key (2018) <[email protected]>" imported gpg: Total number processed: 1 gpg: imported: 1
时间: 2025-06-05 11:05:59 浏览: 19
<think>我们正在处理两个主要问题:apt-key已弃用和nvidia-keyring.gpg文件为空的问题。根据之前的对话和引用,我们注意到用户引用了两种添加NVIDIAGPG密钥的方法:1.使用apt-key直接添加(已弃用)2.使用dpkg安装cuda-keyring包(推荐方法)此外,用户提到了一个具体的错误:nvidia-keyring.gpg文件为空。目标:在不使用apt-key的情况下正确配置GPG密钥,并解决空文件问题。步骤:1.移除已弃用的apt-key方法。2.采用新的方法:使用cuda-keyring包(来自NVIDIA官方文档推荐)或者手动将密钥添加到/etc/apt/trusted.gpg.d/目录(但不建议手动添加,因为可能不被信任,而是通过signed-by指定)。3.解决空文件问题:可能是由于之前的操作不当导致,我们需要清理并重建。注意:根据用户之前提供的引用[1]和[2],推荐使用cuda-keyring包。因此,我们将采用这种方法。具体步骤:1.删除现有的空文件或无效的nvidia-keyring.gpg文件:```bashsudorm-vf/etc/apt/trusted.gpg.d/nvidia-keyring.gpg```2.下载并安装cuda-keyring包(注意,我们需要根据系统架构和Ubuntu版本选择正确的包):对于x86_64架构的Ubuntu22.04:```bashwgethttps://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.debsudodpkg-icuda-keyring_1.0-1_all.deb```这将安装一个cuda-keyring包,该包会在/etc/apt/trusted.gpg.d/目录下创建正确的gpg文件,并设置好源列表。3.更新源列表:```bashsudoaptupdate```如果用户不是x86_64架构,或者不是Ubuntu22.04,那么需要从NVIDIA开发者网站下载对应版本。但是,用户的问题中提到了nvidia-keyring.gpg,这可能是用于NVIDIA的JetPackSDK(即Jetson系列产品)的,而不是CUDA的。因此,我们需要区分:如果是Jetson设备(ARM架构),则应该使用以下方法:1.删除空文件:```bashsudorm-v/etc/apt/trusted.gpg.d/nvidia-keyring.gpg```2.下载适用于Jetson的NVIDIA公钥并保存为gpg文件:```bashsudocurl-fsSLhttps://repo.download.nvidia.com/jetson/jetson-ota-public.asc|sudogpg--dearmor-o/usr/share/keyrings/nvidia-archive-keyring.gpg```注意:这里我们遵循新的标准,将密钥放入`/usr/share/keyrings/`目录,而不是`/etc/apt/trusted.gpg.d/`(因为后者是整个系统的信任,而前者可以按源指定)。3.修改NVIDIA的源文件,添加`signed-by`选项:例如,编辑`/etc/apt/sources.list.d/nvidia-l4t.list`,在每一行源的前面添加:```deb[signed-by=/usr/share/keyrings/nvidia-archive-keyring.gpg]<url><distribution><component>```4.更新apt:```bashsudoaptupdate```由于用户在问题中没有明确是x86还是ARM(Jetson),因此我们可以提供两种情况的解决方案。为了通用性,我们将分别描述两种情况。另外,根据之前对话中的引用,用户还提到使用apt-key添加公钥(但已弃用),我们也可以提供手动添加密钥到指定目录的方法(作为备选),但推荐官方包。最终,我们按以下结构组织:一、CUDA(x86平台)解决方案二、JetPack(Jetson平台)解决方案三、手动方法(不推荐,仅作备选)注意:在回答中,我们要强调新的APT安全机制,即不再使用全局信任,而是通过`signed-by`在每个源中指定密钥。由于用户上一次的问题中出现了空文件,我们首先要删除它。下面开始编写回答:</think>
### 解决 `apt-key` 弃用和 NVIDIA GPG 密钥配置的完整指南
#### 一、问题本质分析
`apt-key` 弃用源于 Debian/Ubuntu 新的安全策略,要求 GPG 密钥必须:
- 存储于 `/etc/apt/keyrings/` 或 `/usr/share/keyrings/`
- 通过 `signed-by` 参数关联到特定源
- 不再支持全局信任(`/etc/apt/trusted.gpg.d/` 已废弃)
`nvidia-keyring.gpg empty` 错误通常由密钥文件损坏或非标准安装导致。其数学本质可表示为:
$$
\mathcal{K} = \emptyset \implies \text{Verify}(\sigma, PK) = \text{undefined}
$$
其中 $\mathcal{K}$ 是密钥集合,$\sigma$ 是签名[^1]。
---
#### 二、正确配置方案 (以 Ubuntu 22.04 / Jetson 为例)
**1. 清理旧配置:**
```bash
sudo rm /etc/apt/trusted.gpg.d/nvidia-keyring.gpg # 删除空文件
sudo apt-key del 871920D1991BC93C 2>/dev/null # 废弃旧密钥
```
**2. 新标准密钥安装:**
```bash
# 创建专用目录(若不存在)
sudo mkdir -p /etc/apt/keyrings
# 下载并转换 NVIDIA 密钥 (x86)
sudo curl -fsSL https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/3bf863cc.pub | \
sudo gpg --dearmor -o /etc/apt/keyrings/nvidia.gpg
# ARM/Jetson 使用:
sudo curl -fsSL https://repo.download.nvidia.com/jetson/jetson-ota-public.asc | \
sudo gpg --dearmor -o /etc/apt/keyrings/nvidia.gpg
```
**3. 配置 APT 源:**
编辑 `/etc/apt/sources.list.d/nvidia.list`:
```conf
# x86 CUDA 源示例
deb [signed-by=/etc/apt/keyrings/nvidia.gpg] https://developer.download.nvidia.com/compute/cuda/ubuntu2204/x86_64/ /
# ARM/Jetson 源示例
deb [signed-by=/etc/apt/keyrings/nvidia.gpg] https://repo.download.nvidia.com/jetson/ubuntu r35.3 main
```
**4. 权限修正:**
```bash
sudo chmod 644 /etc/apt/keyrings/nvidia.gpg # 确保可读性
sudo apt update
```
---
#### 三、验证与故障排除
**验证方法:**
```bash
# 检查密钥内容
gpg --list-packets /etc/apt/keyrings/nvidia.gpg | grep keyid
# 测试源连接
sudo apt -o APT::Get::AllowUnauthenticated=true update
```
期望输出应包含:
`[GNUPG:] KEY 3BF863CC... VALID`
**常见错误修复:**
| 错误类型 | 解决方案 |
|---------|----------|
|`NO_PUBKEY XXXXXXX`| 运行:`sudo apt-key export XXXXXXX \| sudo gpg --dearmor -o /etc/apt/keyrings/key.gpg` |
|`Clearsigned file not valid`| 重下密钥:添加 `--use-new-keyring` 到 curl 命令 |
| 防火墙拦截 | 使用备用镜像:<br>`https://developer.download.nvidia.cn/compute/cuda/repos/...` |
---
#### 四、密钥管理最佳实践
1. **密钥轮换机制**
每年更新密钥(NVIDIA 通常在 CUDA 大版本更新时更换)
```bash
# 检查有效期
gpg --list-keys --with-keygrip @/etc/apt/keyrings/nvidia.gpg
```
2. **多源隔离配置**
为每个供应商创建独立密钥文件:
```
/etc/apt/keyrings/
├── nvidia.gpg
├── docker.gpg
└── ros.gpg
```
3. **签名验证公式**
当源文件声明:
$$ \text{源} S_i \xrightarrow{\text{signed-by}} \mathcal{K}_j $$
系统验证:
$$
\forall p \in S_i, \text{Verify}\Big(\sigma_p, \text{Pub}(\mathcal{K}_j)\Big) = \text{true}
$$
---
#### 五、企业环境扩展方案
对于需要本地镜像的场景:
```bash
# 生成内部密钥
gpg --batch --generate-key <<EOF
Key-Type: RSA
Key-Length: 4096
Name-Real: Company Repo
%no-protection
EOF
# 导出信任链
gpg --export -a "Company Repo" | \
sudo tee /etc/apt/keyrings/company.gpg >/dev/null
```
> 注:NVIDIA 官方推荐通过 `.deb` 包管理密钥[^2]:
> `sudo dpkg -i cuda-keyring_1.0-1_all.deb`
---
#### 📝 相关问题
1. 如何为离线系统部署可信 GPG 密钥?
2. 当多个 NVIDIA 源(如 CUDA、NGC)共存时如何管理密钥?
3. 如何验证 `.deb` 包是否被篡改(不依赖 APT)?
4. 在 Docker 构建中如何安全注入 GPG 密钥?
5. apt-key 弃用后如何迁移遗留仓库?
[^1]: Debian APT 架构设计文档 Ch.4.1
[^2]: NVIDIA CUDA 安装指南密钥管理章节
阅读全文
相关推荐










