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

相关文章

  • JS时间分片技术解决长任务导致的页面卡顿

    JS时间分片技术是一种解决长任务导致页面卡顿的方法。在JavaScript执行事件循环时,长任务会耗费大量时间,导致页面失去响应,时间分片技术通过将长任务分解成小任务,分多个时间片执行,从而避免长任务的执行时间过长,保证页面的正常响应。以下是时间分片技术的完整攻略。 一、什么是时间分片 时间分片是JavaScript属性的一种实现,它允许将一个任务分解为多个…

    node js 2023年6月8日
    00
  • nodejs之请求路由概述

    Node.js之请求路由概述 在Node.js中,请求路由是指根据URL及其他的请求信息来确定应该做些什么。在网站开发中,请求路由是非常重要的一环。本文将介绍Node.js中请求路由的概念以及如何实现请求路由。 请求路由的概念 请求路由的基本思路是将不同的URL映射到对应的处理程序中去。例如,我们可以将/start、/upload、/show等URL映射到相…

    node js 2023年6月8日
    00
  • Node.js实现兼容IE789的文件上传进度条

    下面我将详细讲解实现“Node.js实现兼容IE789的文件上传进度条”的完整攻略,过程中将会包含两条示例说明: 简述 在传统的方式下,采用form表单上传文件时,前端无法获得上传文件具体传输进度,需要后端记录文件上传状态并实时传输给前端,因此本文将介绍如何使用Node.js实现兼容IE789的文件上传进度条。 步骤 1. 安装依赖库 使用nodejs的开发…

    node js 2023年6月8日
    00
  • Vue中虚拟DOM的简单实现

    首先,我们需要了解一下什么是虚拟DOM。虚拟DOM是指设计思想上与实际DOM节点树一一对应的JavaScript对象树。当数据模型发生变化时,Vue.js会对新旧虚拟DOM进行比较,只对发生变化的部分进行重新渲染,这样可以大大提升渲染的效率。 在Vue中,虚拟DOM的实现分为三个部分:虚拟DOM节点对象VNode,虚拟DOM的渲染函数,和虚拟DOM的比较函数…

    node js 2023年6月8日
    00
  • 详解nodejs中的异步迭代器

    详解 Node.js 中的异步迭代器 什么是异步迭代器? 在 Node.js 中,迭代器(Iterator)是一种数据结构,它会按照一定的顺序,逐个返回集合中的元素。异步迭代器(AsyncIterator)则是迭代器的异步版本,它可以接受 Promise 对象,并使用 async/await 实现异步操作。 异步迭代器是一个实现了 Symbol.asyncI…

    node js 2023年6月8日
    00
  • TypeScript手写一个简单的eslint插件实例

    下面是详细的攻略: 准备工作 安装相关依赖: npm install -D typescript @typescript-eslint/parser @typescript-eslint/eslint-plugin 其中,typescript 是需要判断的语言,parser 是将代码解析成 AST(Abstract Syntax Tree)的工具,eslin…

    node js 2023年6月8日
    00
  • JS中promise化微信小程序api

    下面是详细讲解 “JS中promise化微信小程序api” 的完整攻略。 什么是Promise Promise是es6中新增加的跟异步有关的特性,用于异步操作的管理。使用Promise后,我们可以像同步代码一样来操作异步代码,从而更好的管理异步代码。 在我们使用异步的时候,通常会遇到一些棘手的问题,例如: 回调地狱 (callback hell) 共享作用域…

    node js 2023年6月8日
    00
  • Node.js自定义对象事件的监听与发射

    下面就给大家详细讲解一下“Node.js自定义对象事件的监听与发射”的完整攻略。 1. Node.js自定义对象事件的监听 为了监听自定义对象事件,我们需要使用 Node.js 中的 events 模块。该模块提供了 EventEmitter 类,可以帮助我们实现自定义事件的监听与触发。 在使用 EventEmitter 之前,我们需要先引入该模块: con…

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