![无法从 18.10 升级到 19.04“无法验证 changelogs.ubuntu.com 的证书”](https://linux22.com/image/910773/%E6%97%A0%E6%B3%95%E4%BB%8E%2018.10%20%E5%8D%87%E7%BA%A7%E5%88%B0%2019.04%E2%80%9C%E6%97%A0%E6%B3%95%E9%AA%8C%E8%AF%81%20changelogs.ubuntu.com%20%E7%9A%84%E8%AF%81%E4%B9%A6%E2%80%9D.png)
我无法从 Ubuntu 18.10 升级到 19.04。
我确认 19.04 已正式发布,并出现在https://changelogs.ubuntu.com/meta-release。
当我运行时sudo update-manager -c
,我在终端中收到以下错误消息(尽管 GUI 只是高兴地报告没有可用的更新):
无法连接到https://changelogs.ubuntu.com/meta-release. 检查您的互联网连接或代理设置
我尝试使用访问该文件wget changelogs.ubuntu.com/meta-release
并收到以下错误消息
--2019-04-20 21:01:27-- https://changelogs.ubuntu.com/meta-release 正在解析 changelogs.ubuntu.com (changelogs.ubuntu.com)...91.189.95.15,2001:67c:1560:8008::11
连接到 changelogs.ubuntu.com (changelogs.ubuntu.com)|91.189.95.15|:443... 已连接。
错误:无法验证 changelogs.ubuntu.com 的证书,由“CN=Let's Encrypt Authority X3,O=Let's Encrypt,C=US”颁发:无法在本地验证颁发者的权限。
要以不安全的方式连接到 changelogs.ubuntu.com,请使用“--no-check-certificate”。
但当我尝试使用 访问同一个文件时curl changelogs.ubuntu.com/meta-release
,下载成功了(我读到某处说它的证书可能更为最新)。
正如我看到的建议,我多次重新启动系统,等待了超过 24 小时,并尝试删除本地~/.cache/update-manager-core/meta-release
,但这没有帮助。
我已验证该网站的证书https://www.ssllabs.com/ssltest/analyze.html?d=changelogs.ubuntu.com&latest并获得了 A+。
我更喜欢不需要我通过 http 而不是 https 获取文件的解决方案。
答案1
以下是我解决问题的方法:
我使用 curl: 通过 https 下载了元发布文件curl http://changelogs.ubuntu.com/meta-release > ~/.cache/update-manager-core/meta-release
。
然后我将本地编辑/etc/update-manager/meta-release
为:
# default location for the meta-release file
[METARELEASE]
#URI = https://changelogs.ubuntu.com/meta-release
URI = file:///home/YOUR-USERNAME/.cache/update-manager-core/meta-release
URI_LTS = https://changelogs.ubuntu.com/meta-release-lts
URI_UNSTABLE_POSTFIX = -development
URI_PROPOSED_POSTFIX = -proposed
请注意,您必须将 YOUR-USERNAME 更改为系统上的适当值。
升级现已顺利进行!
答案2
问题是因为 openssl 正在寻找 的证书/usr/local/ssl/cert.pem
,但该证书无效。我跟进此人的解决方案使用sudo ln -s /etc/ssl/certs/ca-certificates.crt /usr/local/ssl/cert.pem
。
此问题会影响 wget 等其他应用程序。
答案3
更新(2023-03-22): 我发现了一个更简单的方法——只需删除所有证书,然后让 Ubuntu 重新下载它们:
# Make a backup first
mkdir ~/old-certs/
sudo mv /etc/ssl/certs/* ~/old-certs/
# Create a directory for Java certificates, as the below command needs it
sudo mkdir /etc/ssl/certs/java
# update /etc/ssl/certs (remove symlinks) and ca-certificates.crt
sudo update-ca-certificates --fresh
我遇到了完全相同的问题。我按照建议经过@白骑士,但结果不同。使用以下命令strace
查看为什么wget
不起作用:
strace -e trace=open,openat wget https://changelogs.ubuntu.com/meta-release
在日志的某个地方,我看到以下文件被打开了:
/usr/lib/ssl/certs/8d33f237.0
使用 OpenSSL 检查上述文件时,我注意到这是 的过期证书Let's Encrypt
。因此,我将文件移至/tmp
,然后再次尝试该wget
命令。这一次,它非常有效!
答案4
我的机器配置为使用 apt-cache,我通过在 /etc/apt-cacher-ng/acng.conf 中添加 PassThroughPattern 来修复这个问题
PassThroughPattern: ^changelogs\.ubuntu\.com:443$
如果您已经有了 PassThroughPattern,则需要对其进行编辑,例如如果您当前有:
PassThroughPattern: soandso.com:443
将其更改为
PassThroughPattern: ^(soandso\.com|changelogs\.ubuntu\.com):443$
如果这没有帮助,您可能需要尝试以下操作:
$ ( sed -ne 's/^ *\(from\|import.*\)/\1/p' \
/usr/bin/do-release-upgrade \
echo "init_proxy()" \
echo "MetaReleaseCore.DEBUG = True" \
echo "MetaReleaseCore(useProposed=True)"\
) | python3
这应该会为您提供有关导致其失败的更多信息。