应使用 gpg --dearmor 导入 mysql 公钥并配置 signed-by 路径:先执行 sudo mkdir -p /usr/share/keyrings && curl -fssl https://repo.mysql.com/rpm-gpg-key-mysql-2022 | gpg --dearmor -o /usr/share/keyrings/mysql-keyring.gpg,再修改源文件为 deb [arch=amd64 signed-by=/usr/share/keyrings/mysql-keyring.gpg] http://repo.mysql.com/apt/debian bookworm mysql-8.0,最后运行 sudo apt update。

直接导入新密钥并改用 signed-by 配置,别再用 apt-key add —— 它已被弃用,且会绕过APT的安全隔离机制。
为什么 apt update 报 NO_PUBKEY B7B3B788A8D3785C?
这不是网络问题,也不是你漏装了什么包。Debian(尤其是 bookworm 及更新版本)在验证 MySQL APT 仓库签名时,发现本地没存对应公钥,或存的旧密钥已过期。错误里那个 B7B3B788A8D3785C 是 MySQL 官方当前有效的密钥 ID(截至 2026 年仍在轮换使用),不是拼写错误。
常见诱因包括:
- 你之前用
apt-key add导入过密钥,但该命令把密钥塞进了全局信任环(/etc/apt/trusted.gpg),现在密钥过期后无法自动刷新 - MySQL 的
.deb源配置包(如mysql-apt-config_*.deb)自带的密钥路径指向了已失效的旧 keyring 文件 - 手动下载的
.asc密钥未经gpg --dearmor转换,直接丢进/etc/apt/trusted.gpg.d/会导致格式不兼容
正确导入密钥:用 gpg --dearmor + signed-by
这是 Debian/Ubuntu 官方推荐路径,安全、可审计、不污染全局密钥环。
执行以下命令:
sudo mkdir -p /usr/share/keyrings curl -fsSL https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 | gpg --dearmor -o /usr/share/keyrings/mysql-keyring.gpg
注意:curl 必须加 -fsSL,否则可能因重定向失败或 SSL 证书校验中断;gpg --dearmor 是必须步骤,APT 只认二进制 .gpg 格式,不认 ASCII-armored .asc。
然后检查密钥是否有效:
gpg --no-default-keyring --keyring /usr/share/keyrings/mysql-keyring.gpg --list-keys
输出中应包含 pub rsa4096 2022-01-19 [SC] [expires: 2027-01-18] 及对应 key ID B7B3B788A8D3785C。
修改源配置,绑定密钥路径
找到 MySQL 的源文件,通常是 /etc/apt/sources.list.d/mysql.list 或 /etc/apt/sources.list.d/mysql-apt-config.list。
把原来类似这样的行:
deb http://repo.mysql.com/apt/debian/ bookworm mysql-8.0
改成:
deb [arch=amd64 signed-by=/usr/share/keyrings/mysql-keyring.gpg] http://repo.mysql.com/apt/debian/ bookworm mysql-8.0
关键点:
- 必须加
[arch=amd64(或你的实际架构,如arm64),否则 APT 可能忽略该行 -
signed-by=后面是绝对路径,不能用~或相对路径 - 不要保留原配置里任何
gpgkey=或apt-key相关残留字段
改完后运行:
sudo apt update
不再报 NO_PUBKEY 或 EXPKEYSIG,才算真正生效。
如果仍失败,先清理旧密钥干扰
旧的 apt-key 导入行为可能留下冗余密钥,干扰新配置:
- 列出所有 MySQL 相关密钥:
apt-key list | grep -A1 -B1 mysql - 若看到过期密钥(比如 expiry date 是 2024 年前),用其 key ID 删除:
sudo apt-key del B7B3B788A8D3785C(注意:仅对确认过期/冲突的 key 执行) - 删完再跑一次
sudo apt clean && sudo apt update
最常被忽略的一点:密钥文件权限必须是 644,且属主为 root。如果用普通用户下载再 sudo cp 过去,容易保留 600 权限,导致 APT 读取失败——这个错误不会明说,只会静默跳过签名验证。











