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

我正在一个小应用程序login到我的本地无线路由器(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”?

便宜又不安全的答案:

 process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 

在调用https.request()之前,

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

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

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

添加以下环境variables:

 NODE_TLS_REJECT_UNAUTHORIZED=0 

例如与export

 export NODE_TLS_REJECT_UNAUTHORIZED=0 

(非常感谢胡安拉)

不要相信所有试图误导你的人。 在您的请求中,只需添加:

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

如果你打开未经授权的证书,你将不会受到任何保护,没有ssl的工作也不会有太大的区别。 解决scheme是指定您期望的证书,如下一个片段所示。 确保证书的通用名称与您在请求中调用的地址相同(正如在主机中指定的那样):您将得到的是:

 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 }, 

添加到@Armand答案:

添加以下环境variables:

NODE_TLS_REJECT_UNAUTHORIZED = 0例如与导出:

导出NODE_TLS_REJECT_UNAUTHORIZED = 0(非常感谢胡安)

如果你在windows上使用:

 set NODE_TLS_REJECT_UNAUTHORIZED=0 

感谢:@ weagle08

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

或者您可以尝试添加本地名称parsing(在大多数操作系统中的目录中findhosts文件,细节不同),如下所示:

 192.168.1.1 Linksys 

和下一个

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

将工作。