当证书未过期时,axios 失败并显示“证书已过期”

2023-12-19

我正在使用 Axios 发布到远程 API。尽管它已经工作了好几年,但请求突然开始抛出错误“证书已过期” -尽管证书尚未过期。该 API 的域有一个有效的 Let's Encrypt 证书,该证书在接下来的 2 个月内无法进行下一次自动续订。此外,如果我在不同的操作系统上运行完全相同的代码,它就可以工作(我在 Linux 上;如果我将同一台双引导计算机重新启动到 Windows,则同一节点脚本会成功完成其所有 Axios 调用)。

为什么 Axios 可能突然开始报告证书过期,而证书并未过期?

(注意:我知道我可以强制 Axios 根本不检查证书,但这不是所需的解决方案 - 我想了解它失败的原因并纠正它)。


之前使用且默认情况下仍由 LetsEncrypt 桥接的 DST 根刚刚过期 https://letsencrypt.org/docs/dst-root-ca-x3-expiration-september-2021/.

(注编辑 10/05)

nodejs 应该使用具有“兼容性”链的 LetsEncrypt 证书成功连接到服务器(即,对于旧 Android,仍然使用 DST 桥,即使它已过期)如果

  1. 它的信任库(又名根列表)中有 ISRG 根证书。默认情况下,nodejs 使用编译的根列表和v8.0.0 up 包含 ISRG 根 https://github.com/nodejs/node/commit/6331b63ce0e99bc1e5de4e21ea0c9da9df8ab759。然而,像 axios 这样的应用程序代码可以替换或扩展编译列表,在这种情况下,重要的是应用程序使用的版本/内容。

  2. 并且nodejs使用OpenSSL 1.1.0以上(我之前认为需要1.1.1的想法在更彻底的测试中被证明是错误的)或者DST根是removed从信任库中(您无法从编译列表中将其删除,但如果您使用替换列表,则可以从其中省略/删除它)。

    在 Linux 上,至少是带有包管理器的 Linux 发行版,nodejs 是probably构建为使用系统提供的 OpenSSL;检查包管理器显示的依赖项,或者是否ldd $(which node)列出了一些版本libssl and libcrypto(请注意,不同的系统/打包程序有时对这些库文件使用与它们包含的 OpenSSL 版本相关但不相同的版本号!)。

    在 Windows 上,OpenSSL 通常不会安装,即使安装了,也不一定安装在固定位置,因此 Nodejs 通常构建为使用自己的(静态链接)OpenSSL。在这种情况下,nodejs的版本必须足够新,我不知道映射是什么,但看起来你的就足够了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当证书未过期时,axios 失败并显示“证书已过期” 的相关文章

随机推荐