做rejectUnauthorized: false
或process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
不做可能很诱人!它将您暴露给中间攻击的人。
其他答案是正确的,因为问题在于您的证书“由中间CA签名”。有一个简单的解决方案,它不需要第三方库,也不需要ssl-root-cas
将任何其他CA注入或注入到节点中。
节点中的大多数https客户端支持选项,这些选项使您可以为每个请求指定一个CA,它将解析UNABLE_TO_VERIFY_LEAF_SIGNATURE
。这是一个使用节点的内置int https
模块的简单示例。
import https from 'https';
const options = {
host: '<your host>',
defaultPort: 443,
path: '<your path>',
// assuming the bundle file is co-located with this file
ca: readFileSync(__dirname + '/<your bundle file>.ca-bundle'),
headers: {
'content-type': 'application/json',
}
};
https.get(options, res => {
// do whatever you need to do
})
但是,如果可以在托管服务器中配置ssl设置,则最佳解决方案是将中间证书添加到托管提供商。这样,客户端请求者无需指定CA,因为它已包含在服务器本身中。我个人使用namecheap + heroku。对我来说,诀窍是使用创建一个.crt文件cat yourcertificate.crt bundle.ca-bundle > server.crt
。然后,我打开此文件,并在第一个证书之后添加换行符。您可以在以下位置阅读更多内容
https://www.namecheap.com/support/knowledgebase/article.aspx/10050/33/installing-an-ssl-certificate-on-heroku-ssl