我正在尝试使用axios向api端点发出请求,但出现以下错误: Error: unable to verify the first certificate
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(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的原因。
https.Agent
如果该服务具有专用SSL证书(出于测试目的而自行签名,或者由公司的专用CA签名以保护其内部机密),则必须将https代理配置为信任用于签署服务器证书的专用CA:
const httpsAgent = new https.Agent({ ca: MY_CA_BUNDLE });
其中MY_CA_BUNDLE是.pem格式的CA证书数组。
MY_CA_BUNDLE
.pem