【问题标题】:Axios fails with 'certificate has expired' when certificate has not expired当证书未过期时,Axios 失败并显示“证书已过期”
【发布时间】:2021-10-01 04:57:30
【问题描述】:

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

为什么Axios会突然开始报告一个过期的证书,而证书还没过期呢?

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

【问题讨论】:

  • 对于 Linux 和 Windows,DNS 是否解析到相同的 IP?
  • 是的,相同的 IP。我还可以在两个操作系统的网络浏览器中访问 api,它会显示来自两者的有效证书。

标签: axios


【解决方案1】:

The DST root formerly used and by default still bridged by LetsEncrypt just expired.

(注释编辑 10/05)

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

  1. 它的信任库(即根列表)中有 ISRG 根证书。默认情况下,nodejs 使用编译的根列表和v8.0.0 up contains the ISRG root。但是,像 axios 这样的应用程序代码可以替换或扩展已编译的列表,在这种情况下,重要的是应用程序使用的版本/内容。

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

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

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

【讨论】:

  • 谢谢,我自己可能永远也找不到! ldd 命令没有列出 libssl 或 libcrypto,所以我假设这意味着节点正在使用它自己捆绑的 openssl,而不是系统版本(即 1.1.1)。请注意,节点应用程序实际上是通过 npm "n" 包与节点 8.17.0 一起运行的(不幸的是,由于依赖项已被放弃,因此无法使用任何较新版本的节点运行,& 将是一个巨大的替换任务) .所以我想我的搜索还在继续,我要么需要弄清楚是否有可能让 Node 只使用系统版本的 openssl ...
  • ...或者弄清楚如何让 Axios “使用包含 ISRG 的列表覆盖或扩展内置列表”...
  • 我想这回答了这个问题,所以我会接受它并写一个更具体的、针对 Axios 的关于如何给它适当的证书。再次感谢指点!
  • 希望这会引导我找到解决方案 :) stackoverflow.com/questions/69414479/…
【解决方案2】:

我的问题是我不小心使用了旧的 Node 版本,切换到最新发布的版本解决了这个问题。

【讨论】:

    猜你喜欢
    • 2020-09-18
    • 2021-11-22
    • 2022-01-11
    • 2021-11-29
    • 1970-01-01
    • 2018-02-24
    • 2016-09-21
    • 2014-03-13
    • 2020-09-21
    相关资源
    最近更新 更多