apt-get更新失败,因为证书验证失败,由于节点源上的握手失败。

在我的AWS EC2 Ubuntu 18.04.01 LTS实例上运行"sudo apt-get update"失败。
Certificate verification failed: The certificate is NOT trusted. The certificate issuer is unknown

尝试访问 deb.nodesource.com/node_10.x bionic Release 时,出现以下结果:
运行 sudo apt-get update 后的结果如下:
Hit:1 http://us-east-1.ec2.archive.ubuntu.com/ubuntu bionic InRelease
Get:2 http://us-east-1.ec2.archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Ign:3 https://deb.nodesource.com/node_10.x bionic InRelease
Get:4 http://us-east-1.ec2.archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
Err:5 https://deb.nodesource.com/node_10.x bionic Release
  Certificate verification failed: The certificate is NOT trusted. The certificate issuer is unknown.  Could not handshake: Error in the certificate verification. [IP: XX.XXX.XX.XX 443]
Get:6 http://security.ubuntu.com/ubuntu bionic-security InRelease [83.2 kB]
Reading package lists... Done
W: https://deb.nodesource.com/node_10.x/dists/bionic/InRelease: No system certificates available. Try installing ca-certificates.
W: https://deb.nodesource.com/node_10.x/dists/bionic/Release: No system certificates available. Try installing ca-certificates.
E: The repository 'https://deb.nodesource.com/node_10.x bionic Release' no longer has a Release file.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.

看起来我的当前的Node.js安装引起了这个问题。

我已经尝试在etc/ssl/certs中安装和更新ca-certificates,但是没有起到帮助作用。对于如何解决这个问题,我不太确定接下来该怎么办。

我不希望采取快速解决方法来危及服务器的安全。

19个回答

我在尝试将 mongodb-org 4.0 的密钥添加到运行 Ubuntu 18.04 的 Docker 容器时遇到了这个错误。基础镜像中安装的证书出现了问题。幸运的是,我通过安装 ca-certificates 解决了这个问题。
sudo apt install ca-certificates

3谢谢 - 这实际上解决了问题,而不是绕过安全措施。 - carusot42
我正在使用一个不经常使用的“Ubuntu for Windows”实例,但是由于esm.ubuntu.com服务器证书验证失败,所以无法安装ca-certificates。 - jla
我的显示已经运行了最新版本。 - Katastic Voyage
@KatasticVoyage 那么你可能有其他问题。你能否发布一个新的问题,包含所有相关细节,并提到这个问题,说明这些解决方案对你来说不起作用?我想自那时以来很多事情都发生了变化。 - caffeinated.tech
2这应该是一个被接受的答案。今天在18.04.*容器内遇到了同样的问题,安装ca-certificates解决了它。谢谢! - Andrei Sinitson
1我认为这种情况发生的原因是Ubuntu上的根证书已经过时,所以升级ca-certificates可以解决这个问题。 - lucaswxp
1@lucaswxp 坦白说,我不具备知道你所说的是否是问题真正的原因的知识,但我非常欣赏你解释“为什么”而不只是做“如何”。 - yaobin
1对我来说,我只需要确保我更新了它... sudo apt install --only-upgrade ca-certificates - Cobertos
通过使用上述命令更新已安装的ca-certificates软件包,它为我解决了问题。 - Feriman
这解决了我的Sublime Text错误!太好了。这是我的错误信息:Err:6 https://download.sublimetext.com apt/stable/ Release Certificate verification failed: The certificate is NOT trusted. The certificate chain uses expired certificate. Could not handshake: Error in the certificate verification. [IP: 104.236.0.104 443]...E: The repository 'https://download.sublimetext.com apt/stable/ Release' no longer has a Release file. N: Updating from such a repository can't be done securely, and is therefore disabled by default. - Gabriel Staples
注意:关于我在上面的Sublime Text评论在这里查看他们的论坛。他们链接回了这个答案。点赞! - Gabriel Staples
它什么都不做,同样的错误。 - Madeo

你可以在 sources.list 中添加 [trusted=yes]。例如:
deb [trusted=yes] http://ppa.launchpad.net/repo_name/pkg/ubuntu vivid main
deb-src [trusted=yes] http://ppa.launchpad.net/repo_name/pkg/ubuntu vivid main

8嗨,Mike。在更新了/etc/apt/sources.list和/etc/apt/sources.list.d/nodesource.list中的[trusted=yes]之后,我仍然看到相同的错误。 - Joe
1抱歉问个新手问题,但是源列表在哪里?我如何添加trusted=yes?还有,在这个上下文中,“vivid”是什么意思? - schlingel
4如果你正在通过使用ZScaler或类似的软件进行VPN连接,那么你可能也会遇到这个问题。在我的情况下,我只需要关闭VPN,更新就顺利进行了。 - Leo
@schlingel sources.list.d位于/etc/apt/目录下,vivid是Ubuntu发行版(版本)名称的第一部分。 - All Іѕ Vаиітy
1对我没有用... - Linc

对于仍然遇到此问题的人,这是一个解决方案,我从Ubuntu manpages中获取到。
原帖显示了证书验证错误。
Err:5 https://deb.nodesource.com/node_10.x bionic Release
Certificate verification failed: The certificate is NOT trusted. The certificate issuer is unknown.  Could not handshake: Error in the certificate verification. [IP: XX.XXX.XX.XX 443]

我在一个位于公司代理后面的虚拟机上遇到了类似的问题。代理充当中间人,通过解密和重新加密流经代理的流量。尽管我在虚拟机上安装了代理的受信任证书,但仍然出现了这个错误,原因是无效的OCSP响应。为了修复它,我运行了以下命令:
touch /etc/apt/apt.conf.d/99verify-peer.conf \
&& echo >>/etc/apt/apt.conf.d/99verify-peer.conf "Acquire { https::Verify-Peer false }"

这将禁用apt的OCSP验证,不建议使用。
我选择了一个不同的解决方案,可能对其他人不可用。我们公司维护了一个非解密代理,用于这种情况,所以我切换到使用它。

2非常感谢您的提前帮助,这真的很有效。 - fajin yu
是的,我也遇到了同样的问题——那是因为公司的安全设置。 - MC Emperor
1不推荐 [出于安全目的],但这仍然是一个非常好的解释。 - PYK

确保您的日期和时间设置正确。

1这个解决了我在一个旧的Debian系统上遇到的问题。 - Alireza S.N
这个解决了我在Ubuntu 20上的问题,arm64。 - Giorgos Betsos
1关于这个话题,对于我设备时间错误的情况,将它们连接到一个NTP服务器可以解决这个问题。 - JWCS

今天在一台老旧、维护不良的Ubuntu 16版本上发生了这件事。

第一个问题是/etc/apt中的源是HTTP而不是HTTPS,并且它们已被阻止。HTTPS链接未能通过验证,这是预料之中的,因为我相信他们使用了LetsEncrypt并在去年十月更改了他们的认证路径。

但是我无法更新ca-certificates,因为它们被认为是最新的 - 而且我也无法让apt理解它们实际上不是最新的,因为你知道,更新功能不起作用。

所以:

  • 暂时禁用证书验证,方法是在/etc/apt/apt.conf.d/99verify-peer.conf文件中添加以下内容:

    Acquire { https::Verify-Peer false }
    
  • 运行apt update命令以获取新的ca-certificates信息

  • 运行apt install ca-certificates命令

  • 重新启用证书验证

    编辑上述文件并删除对等验证绕过的部分。如果文件现在为空,您可以将其删除。

  • 现在一切应该“大部分”正常工作。
    然后我继续清理apt缓存,并运行完整的dist-upgrade。这反过来解锁了do-release-upgrade命令。第一次尝试时它并没有完全成功,我不得不再次运行apt-get update,清理不需要的软件包并删除两个冲突的软件包,然后进行更新。
    经过几个小时和从18版本的另一个发布升级,我成功将系统升级到Ubuntu 20.04-LTS,并重新安装了之前阶段缺失的两个软件包。现在一切都正常了。

    你可以使用sed命令在设置脚本中将https://替换为http://
    curl -sL https://deb.nodesource.com/setup_10.x | sed 's|https://|http://|' | sudo -E bash -
    

    这当然应该作为最后的选择。


    1嗯...不推荐...此外,一些资源可能在后端仍然重定向到SSL/TLS上的HTTP。 - Artfaith
    1谢谢,这对我来说很有效,我成功地将https更改为http,并安装了apt install ca-certificates,然后再次将http更改为https。https://serverfault.com/questions/1093511/apt-get-update-failing-because-of-certificate-validation/1133024#1133024 - bl3ssedc0de

    问题的原因是什么

    我最初尝试通过PPA和curl在Ubuntu 18.04.01 LTS上安装Node.js:

    curl -sL https://deb.nodesource.com/setup_10.x -o nodesource_setup.sh
    

    然而,运行此命令会在`etc/apt/sources.list.d/`目录下生成一个`nodesource.list`文件,其内容如下:
    deb https://deb.nodesource.com/node_10.x xenial main
    deb-src https://deb.nodesource.com/node_10.x xenial main
    

    所以当运行sudo apt update时,这些源无法通过SSL握手进行验证,导致更新失败。

    我是如何修复的

    1. 导航到/etc/apt/nodesource.list.d
    2. 使用以下命令从系统中删除nodesource.list文件:

      sudo rm nodesource.list

    3. 使用以下命令清除系统中的任何当前Node.js安装:

      sudo apt-get purge nodejs

      sudo apt-get autoremove

    4. 使用以下命令在Ubuntu上安装Distro-Stable版本的Node.js:

      sudo apt update

      sudo apt install nodejs

      sudo apt install npm


    所以当运行时...这些来源无法通过SSL握手进行验证,为什么它们不能被信任? - BlenderBender
    @BlenderBender 在这个错误发生的时候,我找不到为什么这些来源不能被信任的根本原因。 - Joe

    我在WSL2 Ubuntu上遇到了同样的错误,尝试安装ca-certificates但没有成功,因为它已经安装好了。
    然后我更新了/etc/apt/sources.list文件以使用全局服务器,更新了Apt,现在一切正常。升级后,我发现/etc/ssl/certs目录中进行了一些更新;新增了一些证书。
    出于好奇,我又将sources.list文件改回使用镜像服务器,一切都正常工作。

    你能告诉我全球服务器的情况以及你是如何更新/etc/apt/source.list文件的吗? - cloudcop

    总结以上所有的回答,有三种可能性:
    1/ 未安装ca-certificates 解决方案:
    apt install -y ca-certificates
    

    但是你说他们是。所以对于你来说,那不应该是一个答案。
    2/ 禁用https检查(https::Verify-Peer) 解决方案:将此添加到/etc/apt/conf.d/中。
    Acquire { https::Verify-Peer false }
    

    但这会降低您的安全性。
    3/ 找到您服务器的证书并添加它。

    1这没有任何价值 - Dan Parsonson