虽然这个问题已经有些年头,但我也想为那些来到这里的人提供一些帮助。我不是专家,请向您当地的安全顾问等人咨询。
Axios是一个http(s)客户端,而http客户端通常匿名参与TLS。换句话说,服务器接受它们的连接而不识别谁在尝试连接。与之不同的是,双向TLS需要在握手完成之前,服务器和客户端都互相验证对方的身份。
因为互联网是一个危险的地方,我们想要保护我们的客户免于连接到欺骗性的公共终结点。我们通过确保客户在发送任何私人数据之前确定服务器的身份来实现这一点。
// DO NOT DO THIS IF SHARING PRIVATE DATA WITH SERVICE
const httpsAgent = new https.Agent({ rejectUnauthorized: false });
在StackOverflow上,关于任何语言中的https客户端连接故障,经常会发表这种答案(更加突出地得到了点赞)。更糟糕的是,它通常起作用,解决了开发人员的问题。然而,虽然他们肯定进入了门,但这是谁的门呢?由于他们选择不验证服务器的身份,他们可怜的客户端无法知道他们刚刚连接到公司内部网站的线路上是否有坏人监听。
如果服务有公共的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
是一个包含所需端点的服务器证书以及该证书完整证书链的 CA 证书的数组,格式为 .pem
。必须包含链中所有证书直到信任根。
这些选项在哪里有文档记录?
HTTPS 是在 TLS/SSL 上的 HTTP 协议,在 Node.js 中作为单独的模块实现。
因此,传递给 https.Agent
的选项是从 tls.connect()
和 tls.createSecureContext()
传递的选项合并而来。