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


308

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

我运行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'.

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

{ [Error: socket hang up] code: 'ECONNRESET' }

我当前的示例代码是:

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);
});

我如何才能使node.js等效于“ --no-check-certificate”?

Answers:


599

便宜又不安全的答案:

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;

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

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


2
对我来说就像一个魅力!在将所有内容都包含在我的主应用程序js的最顶部之后,我立即放置了此代码。
Xedecimal

这也适用于NodeJS和SailJS组合。我将其添加到local.js的顶部
Michael Kork。

38
不要在生产环境中使用此选项或“ rejectUnauthorized”,因为这会禁用所有类型的安全检查。
杰森·沃尔顿

3
我在使用我的自签名https节点服务器上的mocha运行测试时遇到了麻烦,并且在任何describe块使我的测试通过之前立即添加了该测试。
artis3n 2015年

这可能不是解决问题的最安全方法。见stackoverflow.com/questions/20433287/...
马特·潘宁顿

166

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

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

为我工作。我使用restler,我发现默认情况下它没有转发选项,因此我必须对其进行修补。
Olivier Amblet

2
为此,您需要提供自定义代理的显式实例。创建选项对象并设置代理:'options.agent = new https.Agent(options);' 然后,只需拨打“https.request(选项)”
马克斯

14
好吧,这对我来说只是rejectUnauthorized选择而已,而无其他
好处

@mcont我确认rejectUnauthorized其他所有东西都足够好了。在内部使用vs代码扩展。更好的是允许进行PEM配置,我接下来再做...
escape-llc,

61

不要相信所有试图误导您的人。

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

ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})]

如果您打开了未经授权的证书,那么您将完全不受保护(暴露给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
    },

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

  • CA证书如何工作
  • 如何生成用于轻松测试的CA证书以模拟生产环境

7
这有效,并且是解决问题“错误:证书链中的自签名证书”的正确方法。
RohanRasane

1
为什么将fs.readFileSync放在方括号内,而不是将其存储为字符串?
Lelo

Lelo:方括号将其转换为数组。ca:需要一系列证书。该文件应该是逗号分隔的证书列表,通常人们使用内部函数将PEM文件转换为数组。对于自签名的cet,单个证书“应该”起作用。
JohnDavid

53

添加以下环境变量:

NODE_TLS_REJECT_UNAUTHORIZED=0

例如export

export NODE_TLS_REJECT_UNAUTHORIZED=0

(非常感谢Juanra)


尝试跑步时,这对我webdriver-manager update
Ashley

3
为Windows设置NODE_TLS_REJECT_UNAUTHORIZED = 0
Felipe SS

这对于我的开发环境是一个很好的解决方案
David

14

添加到@Armand答案:

添加以下环境变量:

NODE_TLS_REJECT_UNAUTHORIZED = 0,例如导出时:

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

如果您在Windows上使用:

set NODE_TLS_REJECT_UNAUTHORIZED=0

感谢:@ weagle08


12

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

require('request').defaults({ rejectUnauthorized: false })

3

对于meteorJS,可以使用npmRequestOptions进行设置。

HTTP.post(url, {
    npmRequestOptions: {
        rejectUnauthorized: false // TODO remove when deploy
    },
    timeout: 30000, // 30s
    data: xml
}, function(error, result) {
    console.log('error: ' + error);
    console.log('resultXml: ' + result);
});

1

或者,您可以尝试添加本地名称解析(大多数操作系统hosts在目录etc中找到的文件,详细信息有所不同),如下所示:

192.168.1.1 Linksys 

接下来

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

将工作。


3
确实可以回答这个问题,但在这种情况下,我认为下一个错误将是DEPTH_ZERO_SELF_SIGNED_CERT。
Olivier Amblet

1
那么如何解决DEPTH_ZERO_SELF_SIGNED_CERT?我现在遇到了。
reza

3
@reza:将此添加到您的选项中:rejectUnauthorized: false
Obay 2014年

1
我知道这有点旧,但是为了将来参考(以便以正确的方式进行操作),您需要获得自签名证书的PEM编码,并将其作为CA包含在选项中(您显然也需要设置座席值,但可以为假)。由于证书是自签名的,因此它充当自己的CA,因此可以用来验证自己。但是我也将质疑在路由器上这样做是否值得,因为可以下载固件,因此很容易破坏私钥。
乔纳森·格雷
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.