Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否使用https.request忽略node.js中的无效自签名ssl证书?_Node.js_Https_Ssl Certificate - Fatal编程技术网

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

是否使用https.request忽略node.js中的无效自签名ssl证书?,node.js,https,ssl-certificate,Node.js,Https,Ssl Certificate,我正在开发一个登录到本地无线路由器(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-s

我正在开发一个登录到本地无线路由器(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在您的请求选项中执行与“无检查证书”等效的操作?

,请尝试包括以下内容:

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

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

192.168.1.1 Linksys 
接下来呢

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

将起作用。

廉价且不安全的回答:

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


一种更安全的方法(上面的解决方案使整个节点进程不安全)的答案是添加以下环境变量:

NODE_TLS_REJECT_UNAUTHORIZED=0
e、 g.使用
导出

export NODE_TLS_REJECT_UNAUTHORIZED=0

(非常感谢Juanra)

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

添加到@Armand-answer:


添加以下环境变量:

NODE_TLS_REJECT_UNAUTHORIZED=0
节点\u TLS\u拒绝\u未经授权=0,例如导出:

导出节点\u TLS\u拒绝\u UNAUTHORIZED=0(非常感谢Juanra)

如果您使用windows,请执行以下操作:

set NODE_TLS_REJECT_UNAUTHORIZED=0

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

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

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证书以方便测试,从而模拟生产环境

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

require('request').defaults({ rejectUnauthorized: false })
试一试
导出NODE\u TLS\u REJECT\u UNAUTHORIZED=0所以,我的公司刚刚切换到NODE.js v12.x。 我正在使用
节点\u TLS\u REJECT\u UNAUTHORIZED
,它停止了工作。 经过一番挖掘,我开始在我们的项目中使用
NODE\u EXTRA\u CA\u CERTS=A\u FILE\u,该文件的PEM格式为我们的自签名证书,我的所有脚本都能正常工作

因此,如果您的项目具有自签名证书,那么这个环境变量可能会对您有所帮助



参考:

为我工作。我使用restler,我发现默认情况下它没有转发选项,所以我不得不对它进行修补。创建options对象并设置代理:“options.agent=newhttps.agent(options);”然后只需调用'https.request(options)'好吧,这对我来说只需要
rejectUnauthorized
选项就行了,什么都没有else@mcont我确认刚才的<代码>已经足够好了,其他一切都好了。在vs代码扩展中使用。更好的是允许PEM配置,我将在下一步这样做……没错,这可能会回答这个问题,但我认为在这种情况下,下一个错误将是DEPTH\u ZERO\u SELF\u SIGNED\u CERT。那么如何绕过DEPTH\u ZERO\u SELF\u SIGNED\u CERT呢?我现在遇到了这种情况。@reza:将此添加到您的选项中:
rejectUnauthorized:false
我知道这有点旧,但为了便于将来参考(为了正确执行此操作),您需要获取自签名证书的PEM编码,并将其作为CA包含在选项中(您显然还需要设置代理值,但这可能是错误的)。由于证书是自签名的,因此它充当自己的CA,因此可以用于验证自身。但是,我还想问,在路由器上这样做是否真的值得,因为固件可能会被下载,因此私钥可能很容易被泄露。对我来说,这很有吸引力!我正确地放置了此代码在我将所有内容都包含在主应用程序js的顶部之后。这也适用于NodeJS和SailJS组合。我将其添加到local.js的顶部。请勿使用此或“拒绝未经授权”在生产环境中,因为这会禁用所有类型的安全检查。我在自我签名的https节点服务器上使用mocha运行测试时遇到问题,并在任何descripe块使我的测试通过之前立即添加该测试。这仅用于测试目的。您不应在生产中使用它。如answe中所述r、 这不是解决问题的最安全的方法这在尝试运行
webdriver manager update
set NODE\u TLS\u REJECT\u UNAUTHORIZED=0 for windows时对我有效这对我的开发环境来说是一个很好的解决方案这是解决“错误:证书链中的自签名证书”问题的正确方法为什么要将fs.readFileSync放在括号内,而不是将其存储为字符串?Lelo:括号将其转换为数组。ca:需要一个证书数组。此文件应为逗号分隔的证书列表,通常人们使用内部函数将PEM文件转换为数组。对于自签名cet,单个证书“应”工作。感谢您,这对登录到Sweep时的“错误:无法获取本地颁发者证书”也有很大帮助