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证书数组.
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
Met*_*bre 10
这很脏,但是在脚本的顶部,只需放置:
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
这基本上告诉节点不要检查 SSL 证书,当您在开发中拒绝自签名证书时,这非常方便。
请不要在生产中使用它。
这些配置对我有用(在相互身份验证场景中)。
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 是根据提供的证书(根证书、中间证书、最终条目证书)准备的。不幸的是,在这方面没有找到明确的文件。
对我来说,当我的应用程序在开发模式下运行时,我已经在 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)
归档时间: |
|
查看次数: |
28721 次 |
最近记录: |