如何在Node.js中使用https.request忽略无效的自签名SSL证书?

422

我正在开发一个小应用程序,用于登录我的本地无线路由器(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"的功能?


1
对于在大流行的第四年来到这里的每个人,答案是:NODE_EXTRA_CA_CERTS。摇头,数百个糟糕的回复中唯一提到这个的只有2票。点赞此回答! - Ahmed Fasih
13个回答

1

如果你想使用@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)),
      );

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

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

1

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

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
在您的选项中加入以下内容:rejectUnauthorized: false - Obay
1
我知道这有点老了,但为了将来的参考(为了正确地执行此操作),您需要获取自签名证书的PEM编码,并将其作为CA包含在选项中(显然还需要设置代理值,但可以是false)。由于证书是自签名的,因此它充当自己的CA,因此可以用于验证自身。但是,我也会质疑是否值得在路由器上执行此操作,因为固件可能可以下载,因此私钥可能很容易被攻击。 - Jonathan Gray

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接