我正在使用node.js request.js到达api。我收到这个错误
[错误:UNABLE_TO_VERIFY_LEAF_SIGNATURE]
我所有的凭据都是准确有效的,并且服务器还不错。我对邮递员提出了同样的要求。
request({
"url": domain+"/api/orders/originator/"+id,
"method": "GET",
"headers":{
"X-API-VERSION": 1,
"X-API-KEY": key
},
}, function(err, response, body){
console.log(err);
console.log(response);
console.log(body);
});
该代码仅在可执行脚本ex中运行。node ./run_file.js
,那是为什么?是否需要在服务器上运行?
注意:以下情况很危险,并且将允许在客户端和服务器之间截取和修改API内容。
这也起作用
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
这不是应用程序的问题,而是中间CA签名的证书的问题。如果您接受该事实并且仍然想要继续,请添加以下内容以请求选项:
rejectUnauthorized: false
完整要求:
request({
"rejectUnauthorized": false,
"url": domain+"/api/orders/originator/"+id,
"method": "GET",
"headers":{
"X-API-VERSION": 1,
"X-API-KEY": key
},
}, function(err, response, body){
console.log(err);
console.log(response);
console.log(body);
});
安全的解决方案
您可以将必要的证书添加到链中,而不是关闭安全性。首先从npm安装ssl-root-cas软件包:
npm install ssl-root-cas
该软件包包含许多中间证书,浏览器信任这些中间证书,而节点不信任。
var sslRootCAs = require('ssl-root-cas/latest')
sslRootCAs.inject()
将添加缺少的证书。请参阅此处以获取更多信息:
https://git.coolaj86.com/coolaj86/ssl-root-cas.js
另外,请参阅下面的下一个答案
CoolAJ86的解决方案是正确的,并且不会像使用rejectUnauthorized
或禁用所有检查那样损害您的安全性NODE_TLS_REJECT_UNAUTHORIZED
。不过,您可能仍需要显式注入其他CA的证书。
我首先尝试了ssl-root-cas模块包含的根CA :
require('ssl-root-cas/latest')
.inject();
我仍然以UNABLE_TO_VERIFY_LEAF_SIGNATURE
错误告终。然后,我发现谁颁发了我要通过COMODO SSL Analyzer连接到的网站的证书,下载了该权限的证书并尝试仅添加该证书:
require('ssl-root-cas/latest')
.addFile(__dirname + '/comodohigh-assurancesecureserverca.crt');
我最终遇到另一个错误:CERT_UNTRUSTED
。最后,我注入了附加的根CA,并包含了“我的”(显然是中间人)CA,该CA有效:
require('ssl-root-cas/latest')
.inject()
.addFile(__dirname + '/comodohigh-assurancesecureserverca.crt');
对于Create React App(也会发生此错误,并且这个问题是Google排名第一的问题),您可能正在使用HTTPS=true npm start
和proxy
(在中package.json
)转到一些HTTPS API,该HTTPS API在开发时本身就是自签名的。
如果是这种情况,请考虑进行如下更改proxy
:
"proxy": {
"/api": {
"target": "https://localhost:5001",
"secure": false
}
}
secure
决定WebPack代理是否检查证书链,并禁用以确保未验证API自签名证书,以便获取数据。
做rejectUnauthorized: false
或process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
不做可能很诱人!它将您暴露给中间攻击的人。
其他答案是正确的,因为问题在于您的证书“由中间CA签名”。有一个简单的解决方案,不需要第三方库,也不需要ssl-root-cas
将其他任何CA注入节点。
节点中的大多数https客户端支持选项,这些选项使您可以为每个请求指定一个CA,它将解析UNABLE_TO_VERIFY_LEAF_SIGNATURE
。这是一个使用节点的内建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
。然后,我打开此文件,并在第一个证书之后添加换行符。您可以在以下位置阅读更多内容
只是将其放在此处以防他人受骗,我的情况就不同了,有点奇怪。我是在通过超级代理访问的请求上得到此消息的-这个问题与证书(正确设置)无关,而这与我随后将超级代理结果通过异步模块的瀑布回调传递有关。解决方法:无需传递整个结果,而只需传递result.body
瀑布的回调即可。
我有同样的问题。我已经遵循@ThomasReggi和@ CoolAJ86解决方案,并且运行良好,但是我对该解决方案不满意。
因为由于认证配置级别而发生“ UNABLE_TO_VERIFY_LEAF_SIGNATURE”问题。
我接受@thirdender解决方案,但接受其部分解决方案。根据nginx官方网站,他们明确提到证书应为服务器证书和链接证书的组合。
您也可以通过将strictSSL设置为来尝试false
,如下所示:
{
url: "https://...",
method: "POST",
headers: {
"Content-Type": "application/json"},
strictSSL: false
}
在子域上安装GoDaddy证书后,我的Apache配置出现问题。我本来以为Node不发送服务器名称指示符(SNI)可能是一个问题,但事实并非如此。使用https://www.ssllabs.com/ssltest/分析子域的SSL证书返回了错误链问题:未完成。
gd_bundle-g2-g1.crt
通过SSLCertificateChainFile
Apache指令添加GoDaddy提供的文件后,Node能够通过HTTPS连接,错误消失了。
您必须在服务器中包括中间证书。这样可以解决[错误:UNABLE_TO_VERIFY_LEAF_SIGNATURE]
安全解决此问题的另一种方法是使用以下模块。
node_extra_ca_certs_mozilla_bundle
通过生成包含Mozilla信任的所有根证书和中间证书的PEM文件,该模块可以在不进行任何代码修改的情况下工作。您可以使用以下环境变量(适用于Nodejs v7.3 +),
生成要与上述环境变量一起使用的PEM文件。您可以使用以下方法安装模块:
npm install --save node_extra_ca_certs_mozilla_bundle
然后使用环境变量启动节点脚本。
NODE_EXTRA_CA_CERTS=node_modules/node_extra_ca_certs_mozilla_bundle/ca_bundle/ca_intermediate_root_bundle.pem node your_script.js
其他使用生成的PEM文件的方法可在以下位置找到:
https://github.com/arvind-agarwal/node_extra_ca_certs_mozilla_bundle
注意:我是上述模块的作者。
如果由于使用节点postgres / pg模块而进入此线程,那么比设置NODE_TLS_REJECT_UNAUTHORIZED
或更好的解决方案rejectUnauthorized
,这将导致连接不安全。
而是配置“ ssl”选项以匹配tls.connect的参数:
{
ca: fs.readFileSync('/path/to/server-ca.pem').toString(),
cert: fs.readFileSync('/path/to/client-cert.pem').toString(),
key: fs.readFileSync('/path/to/client-key.pem').toString(),
servername: 'my-server-name' // e.g. my-project-id/my-sql-instance-id for Google SQL
}
我写了一个模块,以帮助分析从环境变量这些选项,如PGSSLROOTCERT
,PGSSLCERT
和PGSSLKEY
:
https://github.com/programmarchy/pg-ssl
以下命令对我有用:
> npm config set strict-ssl false
> npm cache clean --force
问题是您正在尝试使用错误或不受信任的SSL [安全套接字层]证书从存储库中安装模块。清理缓存后,此问题将得到解决。稍后可能需要将其设置为true。
文章标签:javascript , node.js , request , ssl
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!
评论已关闭!