完美解决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日

相关文章

  • Windows下使用Nodejs运行js的方法

    Windows下使用Nodejs运行js的方法 Nodejs是一个基于Chrome V8引擎的Javascript运行环境,能够让Javascript运行于服务器端。在Windows系统下,我们可以通过安装Nodejs来运行js文件。 安装Nodejs 打开Nodejs官网:https://nodejs.org 点击“下载”,下载适合自己操作系统版本的安装包…

    node js 2023年6月7日
    00
  • Node.js 应用探索文件解压缩示例详解

    Node.js 应用探索文件解压缩示例详解 简介 本文通过一个解压缩文件的示例,演示了如何在 Node.js 应用中使用 zlib 模块进行文件解压缩的过程。在示例中,我们使用 fs 模块读取文件,zlib 模块对文件进行解压缩,然后将解压缩后的文件输出到指定位置。 实现步骤 安装依赖 首先,我们需要安装两个依赖: zlib:Node.js 自带的压缩库。 …

    node js 2023年6月8日
    00
  • Nodejs实现内网穿透服务

    Node.js实现内网穿透服务的完整攻略 1. 什么是内网穿透 内网穿透(NGROK)是一种技术,通过将内网服务器映射到公网上,并建立内网服务器与公网之间的通道,从而让外部用户可以直接访问内网服务器。 最常用的场景是在开发调试过程中,我们本地开发的网站需要放到公网上进行测试,通常的方式是将应用程序部署到云平台上。但是这种方式不仅需要花费一定的成本,而且数据传…

    node js 2023年6月8日
    00
  • nodejs 中模拟实现 emmiter 自定义事件

    下面是详细讲解 “nodejs 中模拟实现 emitter 自定义事件” 的完整攻略。 1. 什么是 emitter 自定义事件 在 nodejs 中,EventEmitter 是一个非常重要的模块。其作用是提供了处理事件的基本机制,可以用于实现自定义事件。 实际上,EventEmitter 可以理解为用于注册和监听事件的中介。我们可以通过它来注册自定义事件…

    node js 2023年6月8日
    00
  • node内置调试方法总结

    Node.js内置调试方法总结 在Node.js中,我们可以使用内置的调试方法来方便地调试我们的代码。本文将介绍Node.js内置的调试方法,包括使用debugger语句、在命令行中使用node inspect命令、以及使用Chrome开发者工具进行调试。 使用debugger语句进行调试 在Node.js中,我们可以使用debugger语句来暂停代码的执行…

    node js 2023年6月8日
    00
  • Node.js 学习笔记之简介、安装及配置

    Node.js 学习笔记之简介、安装及配置 简介 Node.js 是一种基于 Chrome V8 引擎的 JavaScript 运行时环境。Node.js 运行在服务端,并采用事件驱动、非阻塞式 I/O 模型,使其轻量又高效。Node.js 的优势在于能够把 JavaScript 语言用于服务端编程,与前端相比,它能够更好地处理 I/O 操作,更高效地开发高…

    node js 2023年6月8日
    00
  • vue单文件组件lint error自动fix与styleLint报错自动fix详解

    当我们使用Vue开发应用时,通常会使用单文件组件来组织组件代码。同时,为了保证代码质量,我们可能会使用Lint工具来检测代码,并自动修复一些简单的错误,以避免在开发过程中浪费时间。 在使用Vue单文件组件和Lint工具的过程中,我们可能会遇到需要自动修复一些错误的情况,例如使用ESLint自动修复未使用变量的错误、使用StyleLint自动修复CSS样式错误…

    node js 2023年6月8日
    00
  • JS幻想 读取二进制文件第1/2页

    下面我会详细讲解“JS幻想 读取二进制文件第1/2页”的完整攻略。 标题 首先,在你的markdown文本中要规定好标题。在这个攻略中,标题应该是“JS幻想 读取二进制文件第1/2页”。 代码块和示例 然后,你需要通过代码块来展示具体的示例。这个攻略中示例代码如下: const PAGE_SIZE = 4096; function readPages(vie…

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