无法验证叶子签名

2020/11/14 07:43 · javascript ·  · 0评论

我正在使用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 startproxy(在中package.json)转到一些HTTPS API,该HTTPS API在开发时本身就是自签名的。

如果是这种情况,请考虑进行如下更改proxy

"proxy": {
  "/api": {
    "target": "https://localhost:5001",
    "secure": false
  }
}

secure 决定WebPack代理是否检查证书链,并禁用以确保未验证API自签名证书,以便获取数据。

rejectUnauthorized: falseprocess.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然后,我打开此文件,并在第一个证书之后添加换行符。您可以在以下位置阅读更多内容

https://www.namecheap.com/support/knowledgebase/article.aspx/10050/33/installing-an-ssl-certificate-on-heroku-ssl

只是将其放在此处以防他人受骗,我的情况就不同了,有点奇怪。我是在通过超级代理访问的请求上得到此消息的-这个问题与证书(正确设置)无关,而这与我随后将超级代理结果通过异步模块的瀑布回调传递有关。解决方法:无需传递整个结果,而只需传递result.body瀑布的回调即可。

我有同样的问题。我已经遵循@ThomasReggi和@ CoolAJ86解决方案,并且运行良好,但是我对该解决方案不满意。

因为由于认证配置级别而发生“ UNABLE_TO_VERIFY_LEAF_SIGNATURE”问题。

我接受@thirdender解决方案,但接受其部分解决方案。根据nginx官方网站,他们明确提到证书应为服务器证书和链接证书的组合。

enter image description here

您也可以通过将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通过SSLCertificateChainFileApache指令添加GoDaddy提供的文件后,Node能够通过HTTPS连接,错误消失了。

您必须在服务器中包括中间证书。这样可以解决[错误:UNABLE_TO_VERIFY_LEAF_SIGNATURE]

安全解决此问题的另一种方法是使用以下模块。

node_extra_ca_certs_mozilla_bundle

通过生成包含Mozilla信任的所有根证书和中间证书的PEM文件,该模块可以在不进行任何代码修改的情况下工作。您可以使用以下环境变量(适用于Nodejs v7.3 +),

NODE_EXTRA_CA_CERTS

生成要与上述环境变量一起使用的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
}

我写了一个模块,以帮助分析从环境变量这些选项,如PGSSLROOTCERTPGSSLCERTPGSSLKEY

https://github.com/programmarchy/pg-ssl

以下命令对我有用:

> npm config set strict-ssl false
> npm cache clean --force

问题是您正在尝试使用错误或不受信任的SSL [安全套接字层]证书从存储库中安装模块。清理缓存后,此问题将得到解决。稍后可能需要将其设置为true。

本文地址:http://javascript.askforanswer.com/wufayanzhengyeziqianming.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!