我试图用axios向api端点发出请求,但得到以下错误:Error: unable to verify the first certificate

axios使用的https模块似乎无法验证服务器上使用的SSL证书.

使用浏览器访问服务器时,证书有效,我可以查看/下载它.我还可以通过https向浏览器上的api发出请求.

我可以通过关闭验证来解决这个问题.这个代码有效.

const result = await axios.post(
    `https://${url}/login`,
    body,
    {
      httpsAgent: new https.Agent({
        rejectUnauthorized: false
      })
    }
  )

问题是,这不会验证SSL证书,因此会打开安全漏洞.

如何配置axios以信任证书并正确验证它?

推荐答案

老问题,但对那些在这里登陆的人来说.没有专家.请咨询当地的安全专家.

Axios是一个http(s)客户端,http客户端通常以匿名方式参与TLS.换句话说,服务器接受他们的连接,而不标识试图连接的人.这是不同的,比如说,双方TLS,在完成握手之前,服务器和客户端都要相互验证.

互联网是一个可怕的地方,我们希望保护我们的客户不连接到被欺骗的公共端点.我们通过确保客户在发送任何私有数据之前识别服务器来实现这一点.

// DO NOT DO THIS IF SHARING PRIVATE DATA WITH SERVICE
const httpsAgent = new https.Agent({ rejectUnauthorized: false });

这经常被发布(而且更夸张地被上浮)作为StackOverflow上关于任何语言的https客户端连接失败的答案.更糟糕的是,它通常是有效的,解除了开发人员的阻碍,他们继续快乐地前进.然而,虽然他们肯定会进门,但这是谁的门?由于他们 Select 不验证服务器的身份,他们可怜的客户无法知道他们刚刚连接到该公司的内部网时是否有坏人在监听.

如果服务具有公共SSL证书,则通常不需要进一步配置https.Agent,因为您的操作系统提供了一组公共受信任的CA证书.这通常是您的浏览器配置使用的同一组CA证书,这就是为什么默认axios客户端可以轻松达到https://google.com.

如果服务具有私有SSL证书(出于测试目的自行签署或由贵公司的私有CA签署以保护其内部机密),则必须将https代理配置为信任用于签署服务器证书的私有CA:

const httpsAgent = new https.Agent({ ca: MY_CA_BUNDLE });

其中MY_CA_BUNDLE是一个CA证书数组,其中包含您要命中的端点的服务器证书和.pem格式的证书的完整证书链.您必须包括链中直至信任根的所有证书.


这些选项记录在哪里?

HTTPS是TLS/SSL上的HTTP协议.在 node 中.js这是作为一个单独的模块实现的.

因此,传递给https.Agent的选项是传递给tls.connect()tls.createSecureContext()的选项的合并.

Node.js相关问答推荐

为什么我的表单数据在我的POST请求中作为应用程序/json发送,为什么它返回错误请求错误?

带有apache Couch-db和Nano的推荐引擎:过滤特定用户的视图

EJS ForEach循环标记

ForbidenError:使用Express.js的CSRF令牌无效

谷歌应用程序脚本UrlFetchApp和nodejs-axios返回不同的结果;MyFitnessPal日记

Playwright - 无法在 img 标签中使用 file:// 访问本地文件

在 puppeteer 中从 pdf 中删除 about:blank 和 date-time

遇到 - TypeError:try 使用 Express(Node.js) 从 JSON 文件访问数据时无法读取未定义的属性(读取帖子)

express 和 mongoose 的新密码不正确

如何为单个 mongo nodejs 驱动程序找到最佳连接池大小

Winston http 日志(log)级别的行为与 info 不同

为什么我在生产环境中 deproy Next.js 示例项目时 CSS 不起作用?

如何限制 cron 表单将消息推送到 RabbitMQ?

调用 require 时的 const vs let

NodeJS为exec设置环境变量

Webpack TypeScript module.hot 不存在

Express.js:没有这样的文件或目录

从 JavaScript 文件或 REPL 中 require()'ing CoffeeScript 文件

node.js 找不到模块mongodb

node.js 服务器和 HTTP/2 (2.0) 与 express.js