我正在尝试使用 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 以信任证书并正确验证它?
原文由 Jemi Salo 发布,翻译遵循 CC BY-SA 4.0 许可协议
老问题,但对那些登陆这里的人来说很重要。没有专家。请咨询您当地的安全专家,什么不是。
Axios 是一个 http(s) 客户端,http 客户端通常匿名参与 TLS。换句话说,服务器接受他们的连接而不识别谁正在尝试连接。这与说相互 TLS 不同,其中服务器和客户端在完成握手之前相互验证。
互联网是一个可怕的地方,我们希望保护我们的客户免于连接到欺骗性的公共端点。我们通过确保我们的客户在发送任何私人数据之前识别服务器来做到这一点。
这通常作为 StackOverflow 上关于任何语言的 https 客户端连接失败的答案发布(并且受到更多人的反对)。更糟糕的是,它通常可以正常工作,解除对开发者的阻碍,然后他们继续愉快地前进。然而,虽然他们肯定进了门,但那是谁的门呢?由于他们选择不验证服务器的身份,他们可怜的客户无法知道他们刚刚与公司内部网建立的连接是否有不良行为者在线监听。
如果服务具有公共 SSL 证书,则
https.Agent
通常不需要进一步配置,因为您的操作系统提供了一组公共受信任的 CA 证书。这通常是您的浏览器配置使用的同一组 CA 证书,这就是为什么默认 axios 客户端可以轻松访问 https://google.com 的原因。如果服务具有私有 SSL 证书(自签名用于测试目的或由您公司的私有 CA 签名以保护其内部机密),则必须将 https 代理配置为信任用于签署服务器证书的私有 CA:
其中
MY_CA_BUNDLE
是一个 CA 证书数组,其中包含您要访问的端点的服务器证书和.pem
格式的完整证书链。您必须将链中的所有证书包括到信任根。这些选项记录在哪里?
因此传递给
https.Agent
的选项是传递给tls.connect()
和tls.createSecureContext()
的选项的合并。