无法验证叶签名

Tho*_*ggi 118 javascript ssl request node.js

我正在使用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);
});
Run Code Online (Sandbox Code Playgroud)

此代码只是在可执行脚本ex中运行.node ./run_file.js那是为什么?它需要在服务器上运行吗?

Tho*_*ggi 137

注意:以下内容很危险,并允许在客户端和服务器之间拦截和修改API内容.

这也有效

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

  • 我对此进行了修改,并感谢您的回答,但它对您的安全性有害.您应该在@ CoolAJ86的答案下面添加缺少的CA. (21认同)
  • 我正在使用名为`nodemailer`和`nodemailer-smtp-transport`的NodeJS插件,并使用相同的通用命令.你需要将它添加到你的`createTransport`对象:`tls:{rejectUnauthorized:false}` (4认同)
  • 不过,我猜@LukeP对nodemailer同样不安全.这个名字有一个线索:如果某事是**Un**授权的,你通常会想要拒绝它,顾名思义.您需要的是找到一种正确授权的方法(通过正确设置CA证书,正如其他答案已经说过的那样). (3认同)
  • @mikemaccana 如果请求在同一台服务器上并且您是唯一的所有者,则没有安全问题。 (2认同)

And*_*nak 84

这不是应用程序的问题,而是由中间CA签署的证书.如果您接受该事实并仍想继续,请将以下内容添加到请求选项中:

rejectUnauthorized: false
Run Code Online (Sandbox Code Playgroud)

完整要求:

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);
});
Run Code Online (Sandbox Code Playgroud)

  • 尝试使用SSL分析器验证服务器:https://sslanalyzer.comodoca.com/ (2认同)

Coo*_*J86 71

安全的解决方案是向链中添加必要的证书.首先从npm 安装ssl-root-cas包:

npm install ssl-root-cas
Run Code Online (Sandbox Code Playgroud)

此程序包包含许多浏览器信任的中间证书,但节点不支持.

var sslRootCAs = require('ssl-root-cas/latest')
sslRootCAs.inject()
Run Code Online (Sandbox Code Playgroud)

将添加缺少的证书.有关详情,请参阅此处:

https://github.com/coolaj86/node-ssl-root-cas

  • Http客户端是否不使用Windows受信任的根证书颁发机构证书存储区? (2认同)
  • Node 使用二进制文件中捆绑的 Mozilla 证书,并且只要您提供自己的“ca”数组,它就会覆盖它们。我不知道它的 http 模块是否也会查找操作系统链。然而,OS X 上的curl似乎只使用操作系统链,不允许手动指定证书。 (2认同)

Fer*_*ntl 42

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

我首先尝试了ssl-root-cas模块包含的根CA :

require('ssl-root-cas/latest')
  .inject();
Run Code Online (Sandbox Code Playgroud)

我仍然最终得到了UNABLE_TO_VERIFY_LEAF_SIGNATURE错误.然后我发现谁为我通过COMODO SSL Analyzer连接的网站颁发了证书,下载了该权限的证书,并试图只添加那个:

require('ssl-root-cas/latest')
  .addFile(__dirname + '/comodohigh-assurancesecureserverca.crt');
Run Code Online (Sandbox Code Playgroud)

我最后又出现了另一个错误:CERT_UNTRUSTED.最后,我注入了额外的根CA并包含了"my"(显然是中间的)CA,其工作原理如下:

require('ssl-root-cas/latest')
  .inject()
  .addFile(__dirname + '/comodohigh-assurancesecureserverca.crt');
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!对于我的问题,我需要添加整个证书链以解决此错误。供其他人参考,这篇文章向我展示了如何通过 Firefox 轻松导出所需的 pem 文件:http://superuser.com/a/97203 (2认同)

Tom*_*uer 16

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

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

"proxy": {
  "/api": {
    "target": "https://localhost:5001",
    "secure": false
  }
}
Run Code Online (Sandbox Code Playgroud)

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


Sim*_*mon 7

rejectUnauthorized: falseprocess.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';不做可能很诱人!它使您暴露在中间人攻击面前。

其他答案是正确的,因为问题在于您的证书“由中间 CA 签名”。对此有一个简单的解决方案,它不需要第三方库,例如ssl-root-cas或将任何额外的 CA 注入节点。

节点中的大多数 https 客户端都支持允许您为每个请求指定 CA 的选项,这将解析UNABLE_TO_VERIFY_LEAF_SIGNATURE. 这是一个使用 node 内置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
})
Run Code Online (Sandbox Code Playgroud)

但是,如果您可以在托管服务器中配置 ssl 设置,最好的解决方案是将中间证书添加到您的托管服务提供商。这样客户端请求者不需要指定 CA,因为它包含在服务器本身中。我个人使用 namecheap + heroku。我的诀窍是用 .crt 文件创建一个 .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


SUB*_*ULI 6

您也可以尝试将strictSSL设置为false,如下所示:

{  
   url: "https://...",
   method: "POST",
   headers: {
        "Content-Type": "application/json"},
   strictSSL: false
}
Run Code Online (Sandbox Code Playgroud)


Sha*_* RB 5

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

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

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

在此处输入图片说明