无法验证叶子签名

IT技术 javascript node.js ssl request
2021-02-08 05:11:25

我正在使用 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);
});

这段代码只是在一个可执行脚本中运行。node ./run_file.js,这是为什么呢?它需要在服务器上运行吗?

6个回答

注意:以下是危险的,并且会允许客户端和服务器之间拦截和修改 API 内容。

这也有效

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';

@mikemaccana 如果请求在同一台服务器上并且您是唯一的所有者,则没有安全问题。
2021-03-25 05:11:25
我对此进行了修改,感谢您的回答,但这对您的安全有害。您应该根据下面@CoolAJ86 的回答添加缺少的 CA。
2021-03-27 05:11:25
不过,我猜@LukeP 对 nodemailer 来说同样不安全。名称中有一个线索:如果某事未经授权,根据定义,您通常希望拒绝它。您需要的是找到一种正确授权的方法(通过正确设置 CA 证书,正如其他答案已经说过的那样)。
2021-03-31 05:11:25
@Bruno 我同意,您应该使用证书以正确的方式进行设置。我只是想为演示设置一个快速测试,所以我发布的代码是一个快速修复。我应该在我的评论中以此开头。
2021-04-04 05:11:25
我现在用的是插件的NodeJS叫nodemailernodemailer-smtp-transport和相同的总指挥部的工作。您需要将其添加到您的createTransport对象中:tls:{rejectUnauthorized: false}
2021-04-08 05:11:25

这不是应用程序的问题,而是由中间 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);
});
这实际上并不正确:正如 CoolAJ86 和 hectorcorrea 所提到的,证书是有效的,但它是由中间 CA 签署的。
2021-03-27 05:11:25
我现在在工作中遇到这个问题。我提交了一张 IT 票,告诉他们 SSL 可能配置错误——他们告诉我我疯了。我可以给他们更多信息来解决这个问题吗?
2021-04-07 05:11:25

安全解决方案

您可以将必要的证书添加到链中,而不是关闭安全性。首先从 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

@Sunkas 这正是错误消息所说的。我不知道如何解释更简单。这是一个只读文件,无法编辑。
2021-03-21 05:11:25
node 使用捆绑在二进制文件中的 mozilla 证书,只要您提供自己的ca数组,它就会覆盖它们我不知道它的 http module是否也会查看 OS 链。但是,OS X 上的 curl 似乎只使用 OS 链,不允许手动指定证书。
2021-03-24 05:11:25
这是否必须为每个进程运行,还是我可以运行一次并全局更新我的证书?
2021-03-27 05:11:25
我投票的不是答案本身,而是作者提供的链接后面带有“先尝试这个”解释的文章。干得好@coolaj86!实际上有帮助
2021-04-01 05:11:25
Http 客户端是否不使用 Windows 受信任的根证书颁发机构证书存储?
2021-04-09 05:11:25

CoolAJ86 的解决方案是正确的,它不会危及您的安全,例如禁用所有使用rejectUnauthorized或 的检查NODE_TLS_REJECT_UNAUTHORIZED不过,您可能需要明确注入额外的 CA 证书。

我首先尝试了ssl-root-casmodule包含的根 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,它起作用了:

require('ssl-root-cas/latest')
  .inject()
  .addFile(__dirname + '/comodohigh-assurancesecureserverca.crt');
如果您获得证书作为.cer运行openssl x509 -inform DER -in YOUR_CERTIFICATE.cer -out YOUR_CERTIFICATE.crt,则可以.crt预先将其转换为 ta
2021-03-16 05:11:25
我使用 COMODO High-Assurance Secure Server CA 颁发的证书连接到一个网站。我从他们的下载页面下载了证书
2021-03-19 05:11:25
嗯,谢谢你的帮助。就我而言,最终它是 SSL 服务器的错误配置,而不是节点。并非所有中间证书都安装在服务器上。
2021-03-19 05:11:25
谢谢!对于我的问题,我需要添加整个证书链以克服此错误。供其他人参考,这篇文章向我展示了如何通过 Firefox 轻松导出所需的 pem 文件:superuser.com/a/97203
2021-04-02 05:11:25

对于Create React App(也发生此错误并且此问题是 Google 排名第一的结果),您可能正在使用HTTPS=true npm startproxy(in package.json),它在开发时转到某些 HTTPS API,该 API 本身是自签名的。

如果是这种情况,请考虑proxy像这样更改

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

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