我正在开发一个小应用程序,可以登录到我的本地无线路由器(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'.

在node中,被捕获的错误是:

{ [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”?


当前回答

补充@Armand的回答:

添加如下环境变量: NODE_TLS_REJECT_UNAUTHORIZED=0例如: export NODE_TLS_REJECT_UNAUTHORIZED=0(非常感谢Juanra)

如果你了解windows的使用情况:

set NODE_TLS_REJECT_UNAUTHORIZED=0

感谢:@weagle08

其他回答

或者你可以尝试添加本地名称解析(在大多数操作系统中,hosts文件可以在目录etc中找到,细节不同),像这样:

192.168.1.1 Linksys 

和明年

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

将工作。

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

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

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

如果您正在使用@nestjs/axios寻找帖子,

以下是没有证书的语法(非生产解决方案):

const token = Buffer.from(`${user}:${password}`,'utf8').toString('base64')

const config = {
      headers: {
        'Content-Type': 'application/json',
        Authorization: `Basic ${token}`,
      },
      httpsAgent: new https.Agent({
        rejectUnauthorized: false
      }),
    };

const responseData = await firstValueFrom(
        this.httpService.post(url, data, config).pipe(map((response) => response.data)),
      );

以下是certificate的语法(生产解决方案):

const token = Buffer.from(`${user}:${password}`,'utf8').toString('base64')

const config = {
      headers: {
        'Content-Type': 'application/json',
        Authorization: `Basic ${token}`,
      },
      httpsAgent: new https.Agent({
        rejectUnauthorized: true,
        ca: fs.readFileSync(path.join(__dirname, './resources/certificateName'))
      }),
    };

const responseData = await firstValueFrom(
        this.httpService.post(url, data, config).pipe(map((response) => response.data)),
      );

添加如下环境变量:

NODE_TLS_REJECT_UNAUTHORIZED=0

例如用export:

export NODE_TLS_REJECT_UNAUTHORIZED=0

(非常感谢Juanra)

试一试 出口NODE_TLS_REJECT_UNAUTHORIZED = 0