完美解决node.js中使用https请求报CERT_UNTRUSTED的问题

当我们使用Node.js中的https模块发送请求时,有时会遇到一个CERT_UNTRUSTED的报错问题,这是因为我们请求的是一个自签名的网站证书,而Node.js默认不信任这类证书。本攻略将介绍如何完美解决这个问题。

问题原因

在https请求过程中,客户端会验证服务器的证书是否信任。如果服务器证书是由权威机构颁发的,那么客户端会信任该证书;如果是自签名的证书,则需要客户端手动信任。

解决方案

方法一:忽略证书验证

我们可以使用以下代码忽略证书验证,跳过报错问题。

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

在发送请求前,加入这句代码即可。

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

https.get('https://example.com', (res) => {
  // 处理响应数据
});

虽然这个方法可以解决问题,但会影响到所有HTTPS请求的安全性,不建议在生产环境中使用。

方法二:添加自定义证书

该方法可以在不影响其他HTTPS请求的前提下,解决证书信任问题。具体步骤如下:

  1. 首先,需要获取待请求网站的证书。可以使用openssl命令来获取证书信息,比如:

bash
$ openssl s_client -connect example.com:443 -showcerts

该命令会输出该网站的证书信息,将每个证书的内容(包含 BEGIN CERTIFICATE 和 END CERTIFICATE )复制到一个文本文件中,保存为 example.com.pem 。

  1. 在Node.js代码中使用该证书:

```javascript
const https = require('https');
const fs = require('fs');

const options = {
hostname: 'example.com',
port: 443,
path: '/',
method: 'GET',
ca: fs.readFileSync('example.com.pem')
};

const req = https.request(options, (res) => {
// 处理响应数据
});

req.end();
```

在options中,我们通过指定ca字段,告诉Node.js使用该自定义证书来验证服务器证书。注意,该字段的值应该是证书文件的内容,可以使用fs.readFileSync()方法来读取。

  1. 如果你的证书中使用了密码,这里还需要指定证书密码:

javascript
const options = {
...
key: fs.readFileSync('example.com.key'),
passphrase: 'your_password',
ca: fs.readFileSync('example.com.pem')
};

至此,我们已经完美解决了Node.js中使用https请求报CERT_UNTRUSTED的问题。

示例说明

示例一

在此示例中,我们先使用方法一来发送请求获取百度首页的HTML文本。

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

https.get('https://www.baidu.com', (res) => {
  let chunks = [];
  res.on('data', (chunk) => {
    chunks.push(chunk);
  });
  res.on('end', () => {
    const html = Buffer.concat(chunks).toString();
    console.log(html);
  });
}).on('error', (e) => {
  console.error(e);
});

运行该示例,会看到报错信息:

Error: certificate has expired
    at TLSSocket.onConnectSecure (_tls_wrap.js:1510:34)
    at TLSSocket.emit (events.js:315:20)
    at TLSSocket._finishInit (_tls_wrap.js:936:8)
    at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:710:12) {
  code: 'CERT_HAS_EXPIRED'
}

可以看到,这是由于百度证书已经过期,导致无法验证。现在,我们使用方法二来发送请求获取百度首页HTML文本:

const https = require('https');
const fs = require('fs');

const options = {
  hostname: 'www.baidu.com',
  port: 443,
  path: '/',
  method: 'GET',
  ca: fs.readFileSync('baidu.com.pem')
};

const req = https.request(options, (res) => {
  let chunks = [];
  res.on('data', (chunk) => {
    chunks.push(chunk);
  });
  res.on('end', () => {
    const html = Buffer.concat(chunks).toString();
    console.log(html);
  });
});

req.end();

我们首先使用openssl s_client命令获取了百度的证书信息,并将每个证书的内容保存到baidu.com.pem文件中。然后,我们在代码中指定该文件作为自定义证书,发送请求。运行该示例,会成功获取到百度首页的HTML文本。

示例二

我们再来一个示例,这次是请求一个使用了密码的自签名证书的网站。我们需要按照方法二的步骤来发送请求。

const https = require('https');
const fs = require('fs');

const options = {
  hostname: 'example.com',
  port: 443,
  path: '/',
  method: 'GET',
  key: fs.readFileSync('example.com.key'), // 证书私钥
  passphrase: 'your_password', // 证书密码
  ca: fs.readFileSync('example.com.pem') // 证书内容
};

const req = https.request(options, (res) => {
  let chunks = [];
  res.on('data', (chunk) => {
    chunks.push(chunk);
  });
  res.on('end', () => {
    const html = Buffer.concat(chunks).toString();
    console.log(html);
  });
});

req.end();

注意,这里我们需要指定证书的私钥路径和密码,才能成功发送请求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:完美解决node.js中使用https请求报CERT_UNTRUSTED的问题 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • Nodejs Express 通过log4js写日志到Logstash(ELK)

    下面是详细讲解“Nodejs Express 通过log4js写日志到Logstash(ELK)”的完整攻略: 什么是ELK? ELK 是 ElasticSearch、Logstash、Kibana 三个开源软件的缩写。 ElasticSearch 是一个基于Lucene搜索引擎构建的开源搜索和数据分析引擎,可以用于全文检索、结构化搜索、统计分析等领域。 L…

    node js 2023年6月8日
    00
  • 基于html5和nodejs相结合实现websocket即使通讯

    HTML5和Node.js简介 HTML5是用于Web设计的新一代标准,支持本地存储、多媒体、拖放和各种新元素的引入。 Node.js是一个基于V8引擎的开源、跨平台的javascript运行环境,可以帮助我们使用javascript编写服务器端代码。 WebSocket的优势和使用场景 WebSocket是HTML5标准中的一个协议,它可以在浏览器和服务器…

    node js 2023年6月8日
    00
  • javascript getElementsByClassName实现代码

    JavaScript的getElementsByClassName方法可以根据给定的类名获取页面中所有对应的元素。下面是基本的实现代码示例: const elements = document.getElementsByClassName(‘example-class’); 其中,example-class为所需获取元素的类名,elements为获取到的所有…

    node js 2023年6月8日
    00
  • nodejs报digital envelope routines::unsupported错误的最新解决方法

    当在Node.js中使用TLS(Transport Layer Security)连接时,可能会遇到digital envelope routines::unsupported错误,这个错误通常表示您的证书格式不被TLS支持。以下是最新的解决方法: 1. 查看证书格式 首先需要使用以下命令来查看您的证书格式: openssl x509 -in /path/t…

    node js 2023年6月8日
    00
  • vue报错Error:Cannot find module ‘fs/promises’的解决方式

    针对“vue报错Error:Cannot find module ‘fs/promises’”这个问题,我们可以按照以下步骤进行解决: 问题分析 这个问题通常会出现在使用 Vue 3.x 版本的时候,它提示我们在运行Vue项目时缺少了Node.js的fs模块,具体报错是“Cannot find module ‘fs/promises’”。 造成这个问题的原因…

    node js 2023年6月8日
    00
  • Node之简单的前后端交互(实例讲解)

    首先回顾一下这篇文章的主要内容。它主要是讲解如何使用Node.js实现前后端交互的过程,具体内容包括: 开启本地服务器,使用Node.js实现对于前端页面的请求响应 在前端页面中使用ajax发送请求,获取后端服务器响应数据 使用ejs模板引擎渲染动态页面 下面我们分别来详细介绍这三部分内容。 开启本地服务器 我们在Node.js中使用http模块创建一个本地…

    node js 2023年6月8日
    00
  • 详解Node.js包的工程目录与NPM包管理器的使用

    非常感谢您对Node.js包的工程目录和NPM包管理器的关注。下面我将为您详细介绍相关知识。 1. Node.js包的工程目录 Node.js包的工程目录包含以下文件和目录: . ├── bin/ │ └── your-cli.js ├── lib/ │ ├── your-library.js │ ├── submodule1.js │ ├── submod…

    node js 2023年6月8日
    00
  • 深入学习nodejs中的async模块的使用方法

    下面是关于深入学习nodejs中的async模块的使用方法的完整攻略。 引言 Node.js 中的异步编程是其最重要的特性之一,但其在编写复杂程序时会带来一些挑战。异步操作常常需要按照某种顺序进行,或者需要等待多个异步操作全部完成,才能进行下一步操作。为了解决这些问题,Node.js 社区开发了许多流行的异步编程库,如async库。 async是一个流行的用…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部