我之前已经成功分发了一个公共密钥(用于签署开源),但几个月后返回开源项目时,构建却无法找到该公钥。
当我尝试重新分发密钥时
gpg --keyserver keys.openpgp.org --send-key XXX
gpg: sending key XXX to hkp://keys.openpgp.org
gpg: keyserver send failed: Certificate expired
gpg: keyserver send failed: Certificate expired
但该证书设置为永不过期。
> gpg --edit-key XXX
sec rsa3072/XXX
created: ... expires: never usage: SC
trust: ultimate validity: ultimate
ssb rsa3072/YYY
created: ... expires: never usage: E
为什么证书设置为永不过期,但却显示已过期,我该如何更新公钥以便再次使用?
谢谢。
答案1
这是关于证书的密钥服务器,不是您尝试上传的证书。(GnuPG 本身几乎从不将 PGP 密钥称为“证书”,它通常将该名称专门保留给密钥签名(又称认证),而不是整个密钥块。)
虽然keys.openpgp.org
接受明文 HKP 请求(端口:11371 上的 HTTP),但它只会将它们重定向到 HKPS(即通常端口:443 上的 HTTPS)。
$ curl -i http://keys.openpgp.org:11371
HTTP/1.1 301 Moved Permanently
Location: https://keys.openpgp.org/
一种可能是您系统的时钟有误,时间过快,以至于系统认为已经过了 12 月。另一种可能是 TLS 客户端已过时,无法正确验证证书。
在 HTTPS 服务上,keys.openpgp.org 使用 Let's Encrypt 证书,并包含由 IdenTrust (DST Root CA X3) 交叉签名的证书链。这与已过期的“DST Root CA X3”相同在九月底。
如果您的操作系统仅安装了 IdenTrust“DST Root”CA,而未安装 Let's Encrypt“ISRG Root”CA,或者安装了两者,但您的 GnuPG 版本链接到不支持备用验证链的 TLS 库,则它将拒绝服务器的 TLS 证书,因为其根 CA 已过期。旧版本的 GnuTLS 和 OpenSSL没有意识到这不是唯一的选择。
例如,在 Debian 中奥尔兹特布尔(gpg 使用 GnuTLS 库)您需要选择libgnutls30 (3.5.8-5+deb9u5 => 3.5.8-5+deb9u6)
软件包升级,并终止任何正在运行的“dirmngr”进程,以便它能够理解多个 TLS 验证链。在 Ubuntu 14.04 中,您需要彻底删除 DST CA。
(Let's Encrypt 仍然将其作为主要链的原因是因为它恰好与非常旧的 Android 版本提供了更好的兼容性。)