问题描述
在使用gpg验证下载文件的签名时,需要先导入密钥。然而,这个操作在实际中非常慢且不稳定。
例如,用户尝试了以下操作:
$ gpg --keyserver pgpkeys.mit.edu --recv-key A0E98066
gpg: keyserver receive failed: No data
$ gpg --keyserver pgpkeys.mit.edu --recv-key A0E98066
gpg: key B550E09EA0E98066: public key "Yichun Zhang (agentzh) <agentzh@gmail.com>" imported
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 14 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 14u
gpg: next trustdb check due at 2019-01-13
gpg: Total number processed: 1
gpg: imported: 1
第一次运行失败,重试后花费了很长时间但最终成功。特别是在CI环境中,这种情况经常发生,因此用户正在寻找替代方案。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
首先,你可以下载密钥并保存为文件,然后在不访问密钥服务器的情况下导入密钥。
以下是具体步骤:
1. 下载密钥:
gpg --keyserver pgpkeys.mit.edu --recv-key A0E98066
gpg --export A0E98066 > openresty-agentzh-A0E98066.gpg
- 导入密钥:
gpg --import openresty-agentzh-A0E98066.gpg
这样,你就可以在不访问密钥服务器的情况下导入密钥了。
方案2
另一种选择是,如果你信任你的仓库或软件源,可以禁用gpg密钥检查。这在连接到通过SSL连接的仓库时特别可行,因为你可以验证你正在拉取正确的源,并且没有中间人攻击。但这样做会失去对每个单独软件包完整性的验证(如果仓库被黑客攻击并插入了恶意软件包或软件包被篡改)。要禁用gpg密钥检查,请在你的仓库文件中设置:
gpgcheck=0
请注意,禁用gpg密钥检查会降低软件包的安全性,请确保你信任你的仓库或软件源。
方案3
如果你需要自动化这个过程,你可以编写一个脚本来定期检查导出的密钥是否仍然是最新的,并在不是最新的情况下发出警报。这样可以确保你始终使用最新的密钥进行验证。
以上是几种避免”gpg –recv-key”带来的不稳定性的解决方案。根据你的具体需求选择合适的方案。
正文完