使用https.request忽略node.js中无效的自签名ssl证书?

Geu*_*uis 279 https ssl-certificate node.js

我正在开发一个登录我本地无线路由器(Linksys)的小应用程序,但我遇到了路由器的自签名证书问题.

我运行wget 192.168.1.1并得到:

ERROR: cannot verify 192.168.1.1's certificate, issued by `/C=US/ST=California/L=Irvine/O=Cisco-Linksys, LLC/OU=Division/CN=Linksys/emailAddress=support@linksys.com':
Self-signed certificate encountered.
ERROR: certificate common name `Linksys' doesn't match requested host name `192.168.1.1'.
To connect to 192.168.1.1 insecurely, use `--no-check-certificate'.
Run Code Online (Sandbox Code Playgroud)

在节点中,捕获的错误是:

{ [Error: socket hang up] code: 'ECONNRESET' }
Run Code Online (Sandbox Code Playgroud)

我目前的示例代码是:

var req = https.request({ 
    host: '192.168.1.1', 
    port: 443,
    path: '/',
    method: 'GET'

}, function(res){

    var body = [];
    res.on('data', function(data){
        body.push(data);
    });

    res.on('end', function(){
        console.log( body.join('') );
    });

});
req.end();

req.on('error', function(err){
    console.log(err);
});
Run Code Online (Sandbox Code Playgroud)

我怎样才能让node.js做相当于"--no-check-certificate"的操作?

Jua*_*nra 559

廉价和不安全的答案:

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;
Run Code Online (Sandbox Code Playgroud)

在代码中,在调用之前 https.request()

在这个问题中回答了一种更安全的方法(上面的解决方案使得整个节点过程不安全)

  • 不要在生产环境中使用此"拒绝"或"拒绝",因为这会禁用所有类型的安全检查. (36认同)
  • 应该在代码中添加哪些内容? (5认同)
  • 我在自签名的https节点服务器上使用mocha运行测试时出现问题,并且在任何描述块之前立即添加此测试使我的测试通过. (3认同)
  • 那么这仅用于测试目的。你不应该在生产中使用它。如答案中所述,这不是解决问题的最安全方法 (3认同)
  • 对我来说就像一个魅力!在我将所有内容都包含在主应用程序js的最顶层之后,我就把这个代码放了. (2认同)

小智 155

在您的请求选项中,请尝试包含以下内容:

   var req = https.request({ 
      host: '192.168.1.1', 
      port: 443,
      path: '/',
      method: 'GET',
      rejectUnauthorized: false,
      requestCert: true,
      agent: false
    },
Run Code Online (Sandbox Code Playgroud)

  • 嗯,这对我来说只有`rejectUnauthorized`选项,没有别的 (12认同)
  • 为我工作。我使用restler,我看到它默认没有转发选项,所以我不得不修补它。 (2认同)
  • 为此,您需要提供自定义代理的显式实例.创建选项对象并设置代理:'options.agent = new https.Agent(options);' 然后只需拨打'https.request(options)' (2认同)

Hes*_*sin 55

不要相信所有试图误导你的人.

在您的请求中,只需添加:

ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})]
Run Code Online (Sandbox Code Playgroud)

如果打开了未经授权的证书,您将无法在所有的(暴露MITM不确认身份)的保护,并没有SSL工作将不会有大的差别.解决方案是指定您期望的CA证书,如下一个代码段所示.确保证书的公用名与您在请求中调用的地址相同(如主机中指定的):

你将得到的是:

var req = https.request({ 
      host: '192.168.1.1', 
      port: 443,
      path: '/',
      ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})],
      method: 'GET',
      rejectUnauthorized: true,
      requestCert: true,
      agent: false
    },
Run Code Online (Sandbox Code Playgroud)

请阅读这篇文章(披露:本答案作者撰写的博客文章),以便了解:

  • CA证书的工作原理
  • 如何生成CA Certs以便轻松进行测试以模拟生产环境

  • 这是有效的,也是修复问题的正确方法"错误:证书链中的自签名证书". (7认同)

Arm*_*and 50

添加以下环境变量:

NODE_TLS_REJECT_UNAUTHORIZED=0
Run Code Online (Sandbox Code Playgroud)

例如export:

export NODE_TLS_REJECT_UNAUTHORIZED=0
Run Code Online (Sandbox Code Playgroud)

(非常感谢Juanra)

  • 为Windows设置NODE_TLS_REJECT_UNAUTHORIZED = 0 (2认同)

Iam*_*ker 13

添加到@Armand回答:

添加以下环境变量:

NODE_TLS_REJECT_UNAUTHORIZED = 0例如导出:

导出NODE_TLS_REJECT_UNAUTHORIZED = 0(非常感谢Juanra)

如果您使用Windows:

set NODE_TLS_REJECT_UNAUTHORIZED=0
Run Code Online (Sandbox Code Playgroud)

谢谢:@ weagle08


Edu*_*rdo 10

您还可以使用默认选项创建请求实例:

require('request').defaults({ rejectUnauthorized: false })
Run Code Online (Sandbox Code Playgroud)


小智 8

因此,我的公司刚刚切换到 Node.js v12.x。我正在使用NODE_TLS_REJECT_UNAUTHORIZED,它停止工作了。经过一番挖掘后,我开始使用NODE_EXTRA_CA_CERTS=A_FILE_IN_OUR_PROJECT具有 PE​​M 格式的自签名证书,并且我的所有脚本都再次运行。

因此,如果您的项目有自签名证书,也许这个环境变量会对您有所帮助。

参考: https: //nodejs.org/api/cli.html#cli_node_extra_ca_certs_file

  • 如果您可以提供根 CA,这个答案效果最好,比完全禁用证书检查要好得多。 (2认同)