一尘不染

如何配置axios以使用SSL证书?

node.js

我正在尝试使用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以信任证书并正确验证它?


阅读 3185

收藏
2020-07-07

共1个答案

一尘不染

古老的问题,但对那些登陆这里的人有所帮助。没有专家。请咨询您当地的安全专家,不可以。

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

互联网是一个令人恐惧的地方,我们希望保护我们的客户避免连接到欺骗性的公共端点。为此,我们确保客户在发送任何私有数据之前先识别服务器。

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

这通常作为关于任何语言的https客户端连接失败的答案发布在StackOverflow上(并且更令人反感)。更糟糕的是,它通常可以正常工作,可以解除开发人员的封锁,而他们会继续前进。但是,尽管他们一定进入了门,但它是谁的门?由于他们选择不验证服务器的身份,因此,可怜的客户端无法知道他们刚刚与公司的Intranet建立的连接是否有不良行为者在监听。

如果服务具有公共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.pem格式的CA证书数组。

2020-07-07