【小沐学Web】Node.js搭建HTTPS 服务器

news2024/11/15 11:44:28

文章目录

  • 1、简介
    • 1.1 HTTPS协议
    • 1.2 Node.js中的HTTPS
  • 2、生成自签名证书
    • 2.1 key文件
    • 2.2 csr文件
    • 2.3 crt文件
  • 4、代码测试
    • 4.1 Node.js简介
    • 4.2 Node.js的http模块
    • 4.3 Node.js的Express模块
    • 4.4 Node.js的https模块
    • 4.5 Node.js的https+express模块
  • 结语

1、简介

1.1 HTTPS协议

HTTPS是什么?HTTPS是基于TLS/SSL的HTTP协议。

HTTPS (全称:Hypertext Transfer Protocol Secure),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS 在HTTP 的基础下加入SSL,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP与 TCP 之间)。这个系统提供了身份验证与加密通讯方法。它被广泛用于万维网上安全敏感的通讯,例如交易支付等方面 。
在这里插入图片描述

1.2 Node.js中的HTTPS

HTTPS在Node.js里它可以作为单独的模块来实现。
(1)生成签名证书。
(2)使用Node.js的HTTPS模块

2、生成自签名证书

通常在企业中面向公网使用的证书通常是由全球权威 CA 机构签发的证书,受各大浏览器厂商信任。
在开发测试时为了简单点我们可以自签名证书,但是这在浏览器中打开时会有安全问题提示。

直接命令行执行openssl会报错。需要将openssl的路径添加到环境变量PATH里。
在这里插入图片描述
复制openssl安装路径。
在这里插入图片描述
添加到环境变量里如下:
在这里插入图片描述
再次执行命令如下:
在这里插入图片描述

使用 openssl 工具生成自签名证书。

2.1 key文件

1、使用 openssl 的 genrsa 命令生成一个服务器私钥文件

# genrsa 生成密钥
# -out 指定输出的文件
openssl genrsa -out server.key 2048

在这里插入图片描述

在这里插入图片描述

2.2 csr文件

2、生成证书请求文件

# -new 执行生成新的证书请求
# -key 指定输入的密钥
openssl req -new -key server.key -out server.csr

# req 生成证书签名请求
# -new 新生成
# -key 私钥文件
# -out 生成的CSR文件
# -subj 生成CSR证书的参数
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Guangdong/L=Guangzhou/O=tomcat/OU=tomcat/CN=tomcat.cn"

报错了。
在这里插入图片描述
openssl出现错误:Can’t open C:\Program Files\Common Files\SSL/openssl.cnf for reading,no such file or directory.

出现这个错误的原因是可能没有设置环境变量OPENSSL_CONF。openssl.cfg是openssl的配置信息。

set OPENSSL_CONF=D:\OpenSSL-Win64\bin\cnf\openssl.cfg

在这里插入图片描述
再次执行上面的命令如下:
在这里插入图片描述
依次添加相关参数如下:

字段字段含义示例
/C=Country 国家CN
/ST=State or Province 省Guangdong
/L=Location or City 城市Guangzhou
/O=Organization 组织或企业tomcat
/OU=Organization Unit 部门tomcat
/CN=Common Name 域名或IPtomcat.cn

在这里插入图片描述
生成文件如下:
在这里插入图片描述

2.3 crt文件

3、根据第 2 步的证书请求文件和第 1 步的服务器私钥文件,生成证书。

# x509 根据现有的证书请求生成自签名根证书
# -days 设置证书的有效天数
# -in 指定输入证书请求文件
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

执行命令如下:
在这里插入图片描述
生成文件如下:
在这里插入图片描述

4、生成如下 三 个文件:

X.509证书包含三个文件:key,csr,crt。

*.key是服务器上的私钥文件,用于对发送给客户端数据的加密,以及对从客户端接收到数据的解密
*.csr是证书签名请求文件,用于提交给证书颁发机构(CA)对证书签名
*.crt是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息
备注:在密码学中,X.509是一个标准,规范了公开秘钥认证、证书吊销列表、授权凭证、凭证路径验证算法等。

4、代码测试

4.1 Node.js简介

Node.js 非常强大,只需动手写几行代码就可以构建出整个HTTP服务器。事实上,我们的Web应用以及对应的Web服务器基本上是一样的。
在我们创建Node.js第一个"Hello, World!"应用前,让我们先了解下Node.js应用是由哪几部分组成的:

  • (1)引入模块(required):我们可以使用require指令来载入Node.js模块。

  • (2)创建服务器:服务器可以监听客户端的请求,类似于Apache 、Nginx等HTTP服务器。

  • (3)接收请求与响应请求:服务器很容易创建,客户端可以使用浏览器或终端发送HTTP请求,服务器接收请求后返回响应数据。

4.2 Node.js的http模块

var http = require('http');

http.createServer(function (request, response) {
	// 发送 HTTP 头部 
	// HTTP 状态值: 200 : OK
	// 内容类型: text/plain
	response.writeHead(200, {'Content-Type': 'text/plain;charset=UTF8'});
	
	// 发送响应数据 "Hello World"
	response.end('Hello World, 爱看书的小沐!\n');
}).listen(8888);

// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');

命令行执行命令:

node server.js

在这里插入图片描述
浏览器预览如下:
在这里插入图片描述

4.3 Node.js的Express模块

Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。使用Express可以快速地搭建一个完整功能的网站。
Express 框架核心特性包括:

  • 可以设置中间件来响应HTTP请求。
  • 定义了路由表用于执行不同的HTTP请求动作。
  • 可以通过向模板传递参数来动态渲染HTML页面。
# 安装Express并将其保存到依赖列表中:
npm install express --save

在这里插入图片描述

接下来我们使用Express框架来输出"Hello World"。

以下实例中我们引入了express模块,并在客户端发起请求后,响应"Hello World"字符串。

创建express_demo.js文件,代码如下所示:

//express_demo.js 文件
var express = require('express');
var app = express();

app.get('/', function (req, res) {
   res.send('Hello World, 爱看书的小沐!');
})

var server = app.listen(8081, function () {

  var host = server.address().address
  var port = server.address().port

  console.log("应用实例,访问地址为 http://%s:%s", host, port)
})

在这里插入图片描述
在这里插入图片描述

在HTTP请求中,我们可以通过路由提取出请求的URL以及GET/POST参数。

接下来我们扩展Hello World,添加一些功能来处理更多类型的HTTP请求。
创建express_demo2.js文件,代码如下所示:

var express = require('express');
var app = express();

//  主页输出 "Hello World"
app.get('/', function (req, res) {
   console.log("主页 GET 请求");
   res.send('Hello GET');
})

//  POST 请求
app.post('/', function (req, res) {
   console.log("主页 POST 请求");
   res.send('Hello POST');
})

//  /list_user 页面 GET 请求
app.get('/list_user', function (req, res) {
   console.log("/list_user GET 请求");
   res.send('用户列表页面');
})

// 对页面 abcd, abxcd, ab123cd, 等响应 GET 请求
app.get('/ab*cd', function(req, res) {   
   console.log("/ab*cd GET 请求");
   res.send('正则匹配');
})

var server = app.listen(8081, function () {
  var host = server.address().address
  var port = server.address().port
  console.log("应用实例,访问地址为 http://%s:%s", host, port)
})

在这里插入图片描述

4.4 Node.js的https模块

https.Server是tls.Server的子类,并且和http.Server一样触发事件。

https.createServer(options[, requestListener])
返回一个新的HTTPS服务器对象。

// curl -k https://localhost:8000/
var https = require('https');
var fs = require('fs');

var options = {
  key: fs.readFileSync('server.key'),
  cert: fs.readFileSync('server.crt')
};

https.createServer(options, function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain;charset=UTF8'});
  res.end("hello world, 爱看书的小沐!\n");
}).listen(8000);
//}).listen(443);

在这里插入图片描述

在这里插入图片描述

使用 Node.js 中 HTTPS 模块开启一个服务
相比传统 HTTP 方式多了一个 options 参数,保证上面生成的自签名证书和和下面文件是同级目录。

https.request(options, callback)
可以给安全web服务器发送请求。

var https = require('https');

var options = {
  hostname: 'encrypted.google.com',
  port: 443,
  path: '/',
  method: 'GET'
};

var req = https.request(options, function(res) {
  console.log("statusCode: ", res.statusCode);
  console.log("headers: ", res.headers);

  res.on('data', function(d) {
    process.stdout.write(d);
  });
});
req.end();

req.on('error', function(e) {
  console.error(e);
});

https.get(options, callback)
和http.get()类似,不过是HTTPS版本的.

var https = require('https');

https.get('https://encrypted.google.com/', function(res) {
  console.log("statusCode: ", res.statusCode);
  console.log("headers: ", res.headers);

  res.on('data', function(d) {
    process.stdout.write(d);
  });

}).on('error', function(e) {
  console.error(e);
});

4.5 Node.js的https+express模块

// app.js
const https = require('https');
const fs = require('fs');
const PORT = 8443;
const options = {
  key: fs.readFileSync('./server.key'),
  cert: fs.readFileSync('./server.crt')
};

https.createServer(options, (req, res) => {
  res.writeHead(200, {'Content-Type': 'text/plain;charset=UTF8'});
  res.end('Hello World!爱看书的小沐!');
}).listen(PORT, () => console.log(`App listening on port ${PORT}!`));

在这里插入图片描述

结合 Express 框架使用:

const express = require('express');
const https = require('https');
const fs = require('fs');
const app = express();
const PORT = 8443;
const options = {
  key: fs.readFileSync('./server.key'),
  cert: fs.readFileSync('./server.crt')
};

https.createServer(options, app)
  .listen(PORT, () => console.log(`App listening on port ${PORT}!`));

app.get('/', (req, res) => res.send('Hello World!爱看书的小沐!'));

在这里插入图片描述

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/684235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT6之多线程控制——互斥量和信号量

在程序中,通常竞争使用临界资源,但如果不加限制就很可能出现异常或未达到预期的结果。 临界资源一次仅允许被一个线程使用,它可以是一块内存、一个数据结构、一个文件或者任何其他具有排他性使用的东西。 这些必须互斥执行的代码段称为“临界区(Critical…

使用VmWare安装黑苹果系统

目录 1.介绍2.破解安装VMware3.unlocker解锁虚拟机3.1 关闭VMware相关的进程3.2 执行安装命令 4.VmWare创建虚拟机5. 下载并配置镜像以及虚拟机设置5.1 修改镜像5.2 修改虚拟机安装路径文件内容 6. 选择镜像启动虚拟机7.安装macOS系统7.1 开启此虚拟机7.2 选择语言->简体中文…

TEC半导体热电温控技术在复合相变材料储热性能测试中的应用

摘要:针对定形相变复合材料热性能测试中ASTM C1784动态热流计法和ASTM C518稳态热流计法的高精度可编程快速温度控制问题,本文提出了采用单独两路TEC半导体热电加热制冷模组作为执行机构的解决方案。解决方案中还配备了不同加热功率的TEC控制电源模块、高…

Netty 聊天室项目案例

1. 登入 在连接建立好之后,客户端发送登入,将登入消息封装为LoginRequestMessage这个类的对象, ctx.writeAndFlush(loginRequestMessage);)使用ctx发送,注意入站处理器调用写相关方法,会触发出站处理器&am…

金升阳|过压保护是什么意思?过压保护电路的构建

过压保护是指在电路中加入一种保护措施,以避免电路过压而导致器件损坏、安全事故等情况的发生。在实际工程中,过压保护电路通常由过压检测电路和过压保护器件组成。本文将详细介绍过压保护的原理、过压保护电路的构建方法、常见的过压保护器件以及应用实…

【LLMs 入门实战 】第二式:MiniGPT4 模型学习与实战

2023年4月17日,多模态问答模型MiniGPT-4发布,实现了GPT-4里的宣传效果《MiniGPT-4: Enhancing Vision-language Understanding with Advanced Large Language Models》《MiniGPT-4:使用高级大语言模型增强视觉语言理解》 模型介绍模型架构微调…

如何在conda环境中正确地使用pip

导言: 在conda环境下使用pip安装库时,许多时候会出现一些奇怪的现象,即用pip安装完成后在该conda环境下却没有该库。本文将说明该问题出现的原因,修复方式和如何正确地在conda环境中使用pip。 问题现象 复现: 新建环…

1-html

一 HTML 初体验 1 HTML 定义 HTML 超文本标记语言——HyperText Markup Language。 超文本是什么&#xff1f;链接标记是什么&#xff1f; 标记也叫标签&#xff0c;带尖括号的文本 2 标签语法 标签成对出现&#xff0c;中间包裹内容<>里面放英文字母&#xff08;标签…

Vim 自定义配色

本文首发于我的个人博客&#xff0c;欢迎点击访问&#xff0c;无广告节面简洁&#xff01; 最近重新开始学习Vim装上了WSL2&#xff0c;但发现Windows Terminal和vim的组合还是有很多问题需要解决的&#xff0c;由其默认的配色在某些状态下根本看不清字体&#xff0c;所以折腾…

小满vue3笔记(含源码解读)

第一章 1.mvvm架构 2.回顾vue2对比vue3 区别&#xff1a; vue2选项式api vue3组合式api 关于这两个的区别&#xff0c;你可以不准确的理解为&#xff0c;选项式api更贴近原生标准html文件结构&#xff1b; 而组合式api就像在html标签中写css&#xff1b;当然做了优化&…

最新大麦网抢票脚本-Python实战

学习时候的一个小例子&#xff0c;python挺有趣的&#xff0c;希望技术可以更进步 我也不多说啥了直接上图 系统:win10 python 版本:3.8.10 需要安装的库:selenium 安装方法: pip install selenium 抢H5版本也写了&#xff0c;但是速度有点慢2…5 就不发了 不如用autojs写感…

前端vue入门(纯代码)15

【16.Vue的过渡与动画】 1.点击切换按钮&#xff1a;实现某一元素的显示/隐藏 Test.vue文件中 <template><div><!-- 点击事件触发后&#xff0c;isShow取反 --><!-- 通过点击按钮让h1标签出现或者消失 --><button click"isShow !isShow&qu…

哈工大计算机网络课程网络层协议详解之:DHCP协议

哈工大计算机网络课程网络层协议详解之&#xff1a;DHCP协议 文章目录 哈工大计算机网络课程网络层协议详解之&#xff1a;DHCP协议如何获得IP地址&#xff1f;硬编码动态主机配置协议-DHCP&#xff1a;&#xff08;Dynamic Host Configuration Protocol&#xff09; 动态主机配…

设计模式篇(Java):前言(UML类图、七大原则)

编写软件过程中&#xff0c;程序员面临着来自耦合性&#xff0c;内聚性以及可维护性&#xff0c;可扩展性&#xff0c;重用性&#xff0c;灵活性等多方面的挑战&#xff0c;设计模式是为了让程序(软件)&#xff0c;具有更好&#xff1a; 代码重用性 (即&#xff1a;相同功能的…

Web自动化测试平台的设计与落地

目录 前言 一、目标和定位 二、平台特点 三、系统架构 四、相关技术栈 五、UI概览 六、待完善部分 总结&#xff1a; 前言 我最初开始接触Web自动化测试的时候&#xff0c;没有直接的领路人&#xff0c;测试行业知识也远不及如今这么丰富和易获取&#xff0c;当时我对于…

Hello算法学习笔记之搜索

一、二分查找 1.从数组中找到target的索引 注意&#xff1a;while条件是< O&#xff08;logn&#xff09; 二分查找并非适用于所有情况&#xff0c;原因如下&#xff1a; 二分查找仅适用于有序数据。若输入数据无序&#xff0c;为了使用二分查找而专门进行排序&#xff…

视频处理器对LED显示屏的作用

视频处理器在LED显示屏中扮演着重要的角色&#xff0c;其作用如下&#xff1a; 图像和视频信号处理&#xff1a;视频处理器负责对输入的图像和视频信号进行处理和优化&#xff0c;以确保在LED显示屏上呈现出高质量的图像和视频内容。它可以对图像进行去噪、锐化、色彩校正、亮度…

【数据结构】复杂度

目录 &#x1f4d6;什么是数据结构&#xff1f;&#x1f4d6;什么是算法&#xff1f;&#x1f4d6;算法效率&#x1f4d6;时间复杂度&#x1f516;大O的渐进表示法&#x1f516;常见时间复杂度计算举例&#x1f516;面试题&#xff1a;消失的数字 &#x1f4d6;空间复杂度&…

I2C协议应用(嵌入式学习)

I2C协议&应用 0. 前言1. 概念2. 特点&工作原理3. 应用示例代码模板HAL模板 0. 前言 I2C是Inter-Integrated Circuit的缩写&#xff0c;它是一种广泛使用的串行通信协议。它由飞利浦&#xff08;现在是NXP Semiconductors&#xff09;开发&#xff0c;并已成为各种电子…