如何配置axios使用SSL证书?

Jem*_*alo 11 ssl ssl-certificate node.js axios

我正在尝试使用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
      })
    }
  )
Run Code Online (Sandbox Code Playgroud)

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

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

srq*_*inn 28

老问题,但为那些降落在这里的人而烦恼.没有专家.请咨询您当地的安全专家,什么不是.

Axios是一个http(s)客户端,http客户端通常匿名参与TLS.换句话说,服务器接受他们的连接而不确定谁正在尝试连接.这与Mutual TLS不同,服务器和客户端在完成握手之前互相验证.

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

// DO NOT DO THIS IF SHARING PRIVATE DATA WITH SERVICE
const httsAgent = new https.Agent({ rejectUnauthorized: false });
Run Code Online (Sandbox Code Playgroud)

这经常被发布(并且更加令人震惊地投票)作为StackOverflow关于任何语言的https客户端连接失败的答案.更糟糕的是,它通常有效,解锁开发者,他们以快乐的方式前进.然而,虽然他们肯定进了门,谁的门?由于他们选择不验证服务器的身份,他们的穷人客户无法知道他们刚刚对公司的内部网做出的连接是否有坏的演员在线听.

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

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

const httpsAgent = new https.Agent({ ca: MY_CA_BUNDLE });
Run Code Online (Sandbox Code Playgroud)

其中MY_CA_BUNDLE.pem格式的CA证书数组.

  • 在我下载证书及其链后,这终于对我有用了。我之前失败了,因为我只下载了我想使用的服务的证书。对于像我一样苦苦挣扎的人:确保将整个链下载为 .pem。 (3认同)
  • 这到底是在哪里记录的?我在 https.Agent 的文档中找不到任何对“ca”选项的引用。 (3认同)
  • @JemiSalo如何获取我的自签名证书的整个链?我通过这样做来解决ID:`const httpsAgent = new https.Agent({ca:fs.readFileSync(certPath)});` (2认同)

Fab*_*osa 17

使用 SSL 证书创建自定义代理:

const httpsAgent = new https.Agent({
  rejectUnauthorized: false, // (NOTE: this will disable client verification)
  cert: fs.readFileSync("./usercert.pem"),
  key: fs.readFileSync("./key.pem"),
  passphrase: "YYY"
})

axios.get(url, { httpsAgent })

// or

const instance = axios.create({ httpsAgent })
Run Code Online (Sandbox Code Playgroud)

来自https://github.com/axios/axios/issues/284

  • `rejectUnauthorized: false` 禁用客户端验证,这是 OP 的主要关注点之一。 (7认同)

Met*_*bre 10

这很脏,但是在脚本的顶部,只需放置:

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';

这基本上告诉节点不要检查 SSL 证书,当您在开发中拒绝自签名证书时,这非常方便。

请不要在生产中使用它。


mnh*_*ilu 9

这些配置对我有用(在相互身份验证场景中)。

const httpsAgent = new https.Agent({
  ca: fs.readFileSync("./resource/bundle.crt"),        
  cert: fs.readFileSync("./resrouce/thirdparty.crt"),
  key: fs.readFileSync("./resource/key.pem"), 
})
Run Code Online (Sandbox Code Playgroud)

注意:bundle.crt 是根据提供的证书(根证书、中间证书、最终条目证书)准备的。不幸的是,在这方面没有找到明确的文件。


Hen*_*ren 5

对我来说,当我的应用程序在开发模式下运行时,我已经在 axios.defaults.options 中直接禁用了拒绝未授权。这项工作非常好。不要在生产模式下这样做。

import https from 'https'
import axios from 'axios'
import config from '~/config'

/**
 * Axios default settings
 */
axios.defaults.baseURL = config.apiURL

/**
 * Disable only in development mode
 */
if (process.env.NODE_ENV === 'development') {
  const httpsAgent = new https.Agent({
    rejectUnauthorized: false,
  })
  axios.defaults.options = httpsAgent
  // eslint-disable-next-line no-console
  console.log(process.env.NODE_ENV, `RejectUnauthorized is disabled.`)
}
Run Code Online (Sandbox Code Playgroud)

  • 应该注意的是,如果您的服务器位于“localhost”上,这是安全的,但在通过互联网调用公共端点时则不安全。 (2认同)
  • 谢谢。这对我有用,但必须将 `axios.defaults.options` 更改为 `axios.defaults.httpsAgent` (2认同)