如何在Debian 11中不使用已弃用的gpg --keyserver选项添加Ubuntu PPA
背景
最近不少朋友在Debian 11上添加Ubuntu PPA时会遇到双重困境:先是apt-key工具被官方标记为弃用,大家转而用gpg直接处理密钥;结果没多久,发现gpg的--keyserver选项也被标了弃用提示——这可把依赖脚本或自动化工具(比如Ansible)的用户愁坏了。
之前我们替换apt-key add的常用写法是这样的:
curl -sS https://example.com/key/repo-key.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/<repo>-archive-keyring.gpg
但添加Ubuntu PPA时,原来依赖gpg --recv-keys --keyserver的命令现在行不通了,得找个新路子。
解决方案
其实我们可以绕开gpg --keyserver选项,直接通过HTTPS从Ubuntu密钥服务器下载密钥,再导入到合规的密钥环中。全程都是命令行操作,完美适配自动化场景,步骤如下:
1. 获取PPA的密钥指纹
首先你得拿到目标PPA的密钥指纹,这个信息通常可以在PPA的Launchpad页面找到,或者从你原来使用的sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com XXXXXX命令里的XXXXXX部分获取。比如假设指纹是ABCDEF1234567890。
2. 下载并导入密钥到专属密钥环
执行下面的命令,把密钥通过HTTPS直接下载,转成gpg兼容的格式后,写入到/usr/share/keyrings目录下的专属密钥文件里(记得替换<PPA_KEY_FINGERPRINT>和<ppa-name>为你的实际信息):
curl -sS https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x<PPA_KEY_FINGERPRINT> | gpg --dearmor | sudo tee /usr/share/keyrings/<ppa-name>-archive-keyring.gpg > /dev/null
这个命令完全避开了gpg --keyserver选项,用curl直接请求密钥服务器的HTTPS接口,符合当前的安全规范。
3. 添加PPA的源配置
接下来把PPA的源信息添加到/etc/apt/sources.list.d目录下,同时一定要加上signed-by参数指向刚才导入的密钥环,这样apt才能正确验证源的签名。示例命令如下(替换<ppa-owner>、<ppa-name>和Ubuntu版本代号,Debian 11一般兼容focal或jammy版本):
echo "deb [signed-by=/usr/share/keyrings/<ppa-name>-archive-keyring.gpg] http://ppa.launchpad.net/<ppa-owner>/<ppa-name>/ubuntu jammy main" | sudo tee /etc/apt/sources.list.d/<ppa-name>.list
4. 更新apt缓存并使用PPA
最后执行apt更新命令,就可以正常从这个PPA安装软件了:
sudo apt update # 安装目标软件 sudo apt install <package-name>
补充说明
- 整个流程完全无手动或GUI操作,所有命令都可以直接集成到Shell脚本或Ansible Playbook中,满足自动化需求。
- 如果你想验证密钥是否正确导入,可以用下面的命令查看密钥环内容:
gpg --no-default-keyring --keyring /usr/share/keyrings/<ppa-name>-archive-keyring.gpg --list-keys
备注:内容来源于stack exchange,提问作者4wk_

