使用HTTPS进行传输加密

news2025/6/3 6:09:31

说明

日期:2025年5月30日

与以纯文本形式发送和接收消息的标准 HTTP 不同,HTTPS 使用SSL/TLS等协议对服务器进行身份验证、加密通信内容和检测篡改。 这样可以防止欺骗、中间人攻击和窃听等攻击。

证书很重要,如果用户主动信任了伪造证书,那https的优势就荡然无存了,所以不要自己添加证书。

示例

日期:2025年5月30日。
操作系统:Alibaba Cloud Linux 3.2104 LTS 64位。
应用:

  • node.js v22.15.1
  • npm 11.4.1
  • Certbot

安装SSL证书

公开的SSL证书必须使用固定域名或固定公网ip。
示例中使用域名fxxkrock.top

修改时区,有的linux失去不是中国,SSL证书含有证书起止时间,所以申请SLL证书后修改时间可能导致证书失效。

sudo timedatectl set-timezone Asia/Shanghai

添加 EPEL 仓库(Certbot 依赖)

sudo yum install -y epel-release

报错

[ecs-user@iZbp18zmckjuyndr4e25koZ server_crystalsearch]$ sudo yum install -y epel-release
Last metadata expiration check: 15:18:43 ago on Thu 29 May 2025 08:17:50 PM CST.
Error:
 Problem: problem with installed package epel-aliyuncs-release-8-15.1.al8.noarch
  - package epel-aliyuncs-release-8-15.1.al8.noarch from @System conflicts with epel-release provided by epel-release-8-22.el8.noarch from epel
  - package epel-aliyuncs-release-8-15.1.al8.noarch from alinux3-updates conflicts with epel-release provided by epel-release-8-22.el8.noarch from epel
  - conflicting requests
(try to add '--allowerasing' to command line to replace conflicting packages or '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)

这个错误是因为系统中已经存在名为 epel-aliyuncs-release 的包,与标准的 epel-release 包冲突。

从包的名称来看,是阿里云自己兼容的epel,所以直接进行下一步。

安装certbot。

[ecs-user@iZbp18zmckjuyndr4e25koZ server_crystalsearch]$ sudo yum install -y certbot

使用 Standalone 模式(需临时停止占用 80/443 端口的服务),获取SSL证书。

[ecs-user@iZbp18zmckjuyndr4e25koZ ~]$ sudo certbot certonly --standalone -d fxxkrock.top
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): 18015262576@189.cn

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.5-February-24-2025.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: n
Account registered.
Requesting a certificate for fxxkrock.top

Certbot failed to authenticate some domains (authenticator: standalone). The Certificate Authority reported these problems:
  Domain: fxxkrock.top
  Type:   connection
  Detail: 47.97.27.78: Fetching http://fxxkrock.top/.well-known/acme-challenge/DqitmUHBr-4eEkBcNWoEZWzAf10C8Gwpm5ipvFxoY1U: Timeout during connect (likely firewall problem)

Hint: The Certificate Authority failed to download the challenge files from the temporary standalone webserver started by Certbot on port 80. Ensure that the listed domains point to this machine and that it can accept inbound connections from the internet.

Some challenges have failed.
Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details.

报错了。从提示看,也就是网不通,要从80端口访问。

Certbot 的 Webroot 模式 和 Standalone 模式的区别

Webroot 模式
  1. 工作原理

    • 在您的网站根目录创建临时验证文件(/.well-known/acme-challenge/
    • Let’s Encrypt 服务器通过 HTTP 访问这些文件验证域名所有权
    • 需要指定网站根目录路径(如 -w /var/www/your-site
  2. 为什么需要路径

    • Certbot 需要将验证文件写入指定目录
    • Web 服务器(Nginx/Apache/Node.js)必须能通过 HTTP 80 端口访问这些文件
    • 例如:http://your-domain.com/.well-known/acme-challenge/xxxxx
  3. 优势

    • 无需停止正在运行的 Web 服务
    • 适合生产环境(服务持续可用)
    • 可与现有 Web 服务器配合使用
  4. 适用场景

    • 已有 Web 服务器运行中
    • 无法临时停止服务
    • 可访问网站根目录
Standalone 模式
  1. 工作原理

    • Certbot 自己启动临时 Web 服务器(监听 80/443 端口)
    • 直接响应 Let’s Encrypt 的验证请求
    • 无需指定路径
  2. 为什么不需要路径

    • Certbot 完全自己处理验证请求
    • 不依赖现有 Web 服务器或文件系统
    • 验证过程在内存中完成,不写入文件
  3. 优势

    • 简单快速,无需配置 Web 服务器
    • 不依赖现有网站目录结构
    • 适合无 Web 服务器的环境
  4. 代价

    • 临时停止占用 80/443 端口的服务
    • 获取证书期间服务短暂中断
    • 不适合 7x24 小时运行的关键服务

技术对比表

特性Webroot 模式Standalone 模式
需要路径✓ (必须指定网站根目录)✗ (完全自包含)
需停止服务✓ (释放80/443端口)
验证方式通过现有Web服务器访问文件自建临时Web服务器响应请求
适合场景生产环境/服务不可中断测试环境/简单快速获取证书
依赖Web服务器✓ (需配置访问.well-known目录)
证书续期影响零中断短暂中断(约10-30秒)

Node.js 场景下的最佳实践

推荐方案:Webroot 模式
# 1. 创建验证目录
sudo mkdir -p /var/www/ssl_validation/.well-known/acme-challenge

# 2. 在Node.js中添加路由处理验证
const app = express();
app.get('/.well-known/acme-challenge/:token', (req, res) => {
  res.sendFile(`/var/www/ssl_validation/.well-known/acme-challenge/${req.params.token}`);
});

# 3. 获取证书
sudo certbot certonly --webroot -w /var/www/ssl_validation -d your-domain.com
Standalone 模式应急使用:
# 1. 停止Node.js服务
sudo systemctl stop node-app

# 2. 获取证书(Standalone模式)
sudo certbot certonly --standalone -d your-domain.com --preferred-challenges http

# 3. 重启服务
sudo systemctl start node-app

为什么 Standalone 不需要路径?深层解释

Standalone 模式的工作流程:

  1. Certbot 启动内置的微型 HTTP 服务器(Python实现)

  2. 监听 80 端口(HTTP验证)或 443 端口(TLS-ALPN验证)

  3. 当 Let’s Encrypt 发送验证请求时:

    LE Server Certbot 请求 http://domain.com/.well-known/acme-challenge/token123 即时生成并返回验证内容 LE Server Certbot
  4. 验证通过后立即销毁临时服务器

  5. 全程不涉及文件系统操作,所有验证内容在内存中动态生成

这种设计使得 Standalone 模式:

  • 完全独立于现有 Web 基础设施
  • 不需要配置任何文件路径
  • 但要求独占端口(需临时停止其他服务)

实际应用建议

对于 Node.js 项目,推荐组合方案:

  1. 首次获取证书:使用 Standalone 模式(简单快速)

    sudo systemctl stop node-app
    sudo certbot certonly --standalone -d your-domain.com
    sudo systemctl start node-app
    
  2. 证书续期:改用 Webroot 模式(无中断)

    // 在Express中添加验证路由
    app.use('/.well-known/acme-challenge', express.static('/etc/letsencrypt/webrootauth'));
    
    # 续期配置
    sudo certbot renew --webroot -w /etc/letsencrypt/webrootauth
    
  3. 终极方案:用 Nginx 处理验证(最佳实践)

    server {
      listen 80;
      server_name your-domain.com;
    
      location /.well-known/acme-challenge {
        root /var/www/certbot;
      }
    
      location / {
        return 301 https://$host$request_uri;
      }
    }
    

    这样 Node.js 只需专注 443 端口 HTTPS 服务,完全解耦证书管理。

从资料看,在过程中,80/443 端口都要使用。

安全设备进出都开启80/443。

[ecs-user@iZbp18zmckjuyndr4e25koZ ~]$ sudo certbot certonly --standalone -d fxxkrock.top
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for fxxkrock.top

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/fxxkrock.top/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/fxxkrock.top/privkey.pem
This certificate expires on 2025-08-28.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

需要记录其中 Certificate 和 Key 的保存位置,web应用需要加载这两个文件。

修改web应用的代码

// 添加https模块
const https = require('https');

// 读取SSL证书文件
const credentials = {
    key: fs.readFileSync('/etc/letsencrypt/live/fxxkrock.top/privkey.pem'),
  cert: fs.readFileSync('/etc/letsencrypt/live/fxxkrock.top/fullchain.pem')
};
// 设置端口号
const port = 3080;

// 创建HTTPS服务器
const server = https.createServer(credentials, app).listen(port, () => {
    console.log(`HTTPS server successfully launched: https://localhost:${port}`);
});

启动web应用

权限不够,无法读取SSL证书

[ecs-user@iZbp18zmckjuyndr4e25koZ server_crystalsearch]$ node server.js
node:fs:562
  return binding.open(
                 ^

Error: EACCES: permission denied, open '/etc/letsencrypt/live/fxxkrock.top/privkey.pem'
    at Object.openSync (node:fs:562:18)
    at Object.readFileSync (node:fs:446:35)
    at Object.<anonymous> (/home/ecs-user/server_crystalsearch/server.js:103:13)
    at Module._compile (node:internal/modules/cjs/loader:1730:14)
    at Object..js (node:internal/modules/cjs/loader:1895:10)
    at Module.load (node:internal/modules/cjs/loader:1465:32)
    at Function._load (node:internal/modules/cjs/loader:1282:12)
    at TracingChannel.traceSync (node:diagnostics_channel:322:14)
    at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:170:5) {
  errno: -13,
  code: 'EACCES',
  syscall: 'open',
  path: '/etc/letsencrypt/live/fxxkrock.top/privkey.pem'
}

Node.js v22.15.1

复制这两证书到网站目录,并修改js代码,把文件路径改为新路径。

[ecs-user@iZbp18zmckjuyndr4e25koZ server_crystalsearch]$ sudo cp /etc/letsencrypt/live/fxxkrock.top/privkey.pem /home/ec
s-user/server_crystalsearch/privkey.pem
[ecs-user@iZbp18zmckjuyndr4e25koZ server_crystalsearch]$ sudo cp /etc/letsencrypt/live/fxxkrock.top/fullchain.pem /home/
ecs-user/server_crystalsearch/fullchain.pem

启动过程无报错

[ecs-user@iZbp18zmckjuyndr4e25koZ server_crystalsearch]$ node server.js
Web folder:  /home/ecs-user/server_crystalsearch/crystalsearch
HTTPS server successfully launched: https://localhost:3060

浏览器访问http://fxxkrock.top:3060/,浏览器显示“响应时间过长”。

访问https://fxxkrock.top:3060/,浏览器显示“响应时间过长”。

忘记在安全设备打开3060端口了。

打开后,https正常,控制台无报错。

访问http会自动跳转到https。

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

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

相关文章

AI书签管理工具开发全记录(八):Ai创建书签功能实现

文章目录 AI书签管理工具开发全记录&#xff08;八&#xff09;&#xff1a;AI智能创建书签功能深度解析前言 &#x1f4dd;1. AI功能设计思路 &#x1f9e0;1.1 传统书签创建的痛点1.2 AI解决方案设计 2. 后端API实现 ⚙️2.1 新增url相关工具方法2.1 创建后端api2.2 创建crea…

X-plore v4.43.05 强大的安卓文件管理器-MOD解锁高级版 手机平板/电视TV通用

X-plore v4.43.05 强大的安卓文件管理器-MOD解锁高级版 手机平板/电视TV通用 应用简介&#xff1a; X-plore 是一款强大的安卓端文件管理器&#xff0c;它可以在电视或者手机上管理大量媒体文件、应用程序。…

使用多Agent进行海报生成的技术方案及评估套件-P2P、paper2poster

最近字节、滑铁卢大学相关团队同时放出了他们使用Agent进行海报生成的技术方案&#xff0c;P2P和Paper2Poster&#xff0c;传统方案如类似ppt生成等思路&#xff0c;基本上采用固定的模版&#xff0c;提取相关的关键元素进行模版填充&#xff0c;因此&#xff0c;海报生成的质量…

Redis--缓存工具封装

经过前面的学习&#xff0c;发现缓存中的问题&#xff0c;无论是缓存穿透&#xff0c;缓存雪崩&#xff0c;还是缓存击穿&#xff0c;这些问题的解决方案业务代码逻辑都很复杂&#xff0c;我们也不应该每次都来重写这些逻辑&#xff0c;我们可以将其封装成工具。而在封装的时候…

python:在 PyMOL 中如何查看和使用内置示例文件?

参阅&#xff1a;开源版PyMol安装保姆级教程 百度网盘下载 提取码&#xff1a;csub pip show pymol 简介: PyMOL是一个Python增强的分子图形工具。它擅长蛋白质、小分子、密度、表面和轨迹的3D可视化。它还包括分子编辑、射线追踪和动画。 可视化示例‌&#xff1a;打开 PyM…

SpringCloud——Docker

1.命令解读 docker run -d 解释&#xff1a;创建并运行一个容器&#xff0c;-d则是让容器以后台进程运行 --name mysql 解释&#xff1a; 给容器起个名字叫mysql -p 3306:3306 解释&#xff1a;-p 宿主机端口:容器内端口&#xff0c;设置端口映射 注意&#xff1a; 1、…

机器学习:欠拟合、过拟合、正则化

本文目录&#xff1a; 一、欠拟合二、过拟合三、拟合问题原因及解决办法四、正则化&#xff1a;尽量减少高次幂特征的影响&#xff08;一&#xff09;L1正则化&#xff08;二&#xff09;L2正则化&#xff08;三&#xff09;L1正则化与L2正则化的对比 五、正好拟合代码&#xf…

运用集合知识做斗地主案例

方法中可变参数 一种特殊形参&#xff0c;定义在方法&#xff0c;构造器的形参列表里&#xff0c;格式&#xff1a;数据类型...参数名称&#xff1b; 可变参数的特点和好处 特点&#xff1a;可以不传数据给它&#xff1b;可以传一个或者同时传多个数据给它&#xff1b;也可以…

《HelloGitHub》第 110 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对开源感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…

使用 Shell 脚本实现 Spring Boot 项目自动化部署到 Docker(Ubuntu 服务器)

使用 Shell 脚本实现 Spring Boot 项目自动化部署到 Docker&#xff08;Ubuntu 服务器&#xff09; 在日常项目开发中&#xff0c;我们经常会将 Spring Boot 项目打包并部署到服务器上的 Docker 环境中。为了提升效率、减少重复操作&#xff0c;我们可以通过 Shell 脚本实现自动…

day023-网络基础与OSI七层模型

文章目录 1. 网络基础知识点1.1 网络中的单位1.2 查看实时网速&#xff1a;iftop1.3 交换机、路由器 2. 路由表2.1 查看路由表的命令2.2 路由追踪命令 3. 通用网站网络架构4. 局域网上网原理-NAT5. 虚拟机上网原理6. 虚拟机的网络模式6.1 NAT模式6.2 桥接模式6.3 仅主机模式 7.…

SpringAI系列4: Tool Calling 工具调用 【感觉这版本有bug】

前言&#xff1a;在最近发布的 Spring AI 1.0.0.M6 版本中&#xff0c;其中一个重大变化是 Function Calling 被废弃&#xff0c;被 Tool Calling 取代。Tool Calling工具调用&#xff08;也称为函数调用&#xff09;是AI应用中的常见模式&#xff0c;允许模型通过一组API或工具…

机器人--里程计

教程 轮式里程计视频讲解 里程计分类 ros--odometry 什么是里程计 里程计是一种利用从移动传感器获得的数据来估计物体位置随时间的变化而改变的方法。该方法被用在许多机器人系统来估计机器人相对于初始位置移动的距离。 注意&#xff1a;里程计是一套算法&#xff0c;不…

设计模式——原型设计模式(创建型)

摘要 本文详细介绍了原型设计模式&#xff0c;这是一种创建型设计模式&#xff0c;通过复制现有对象&#xff08;原型&#xff09;来创建新对象&#xff0c;避免使用new关键字&#xff0c;可提高性能并简化对象创建逻辑。文章阐述了其优点&#xff0c;如提高性能、动态扩展和简…

通过mqtt 点灯

1 解析mqtt 传过来的json 用cjson 解析。 2 类似mvc的结构&#xff0c;调用具体的动作函数 定义设备处理结构体&#xff1a;使用结构体数组映射设备名称与处理函数&#xff0c;实现可扩展的指令分发分离设备逻辑&#xff1a;为每个设备&#xff08;如 LED、Motor&#xff0…

大数据-273 Spark MLib - 基础介绍 机器学习算法 决策树 分类原则 分类原理 基尼系数 熵

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大模型篇章已经开始&#xff01; 目前已经更新到了第 22 篇&#xff1a;大语言模型 22 - MCP 自动操作 FigmaCursor 自动设计原型 Java篇开…

基于 Spring Boot + Vue 的墙绘产品展示交易平台设计与实现【含源码+文档】

项目简介 本系统是一个基于 Spring Boot Vue 技术栈开发的墙绘产品展示交易平台&#xff0c;旨在提供一个高效、便捷的在线商城平台&#xff0c;方便用户浏览、选购墙绘产品&#xff0c;并提供管理员进行商品管理、订单管理等功能。系统采用了前后端分离的架构&#xff0c;前…

【机器学习】支持向量机

文章目录 一、支持向量机简述1.概念2.基本概念3.算法介绍4.线性可分5.算法流程 二、实验1.代码介绍2.模型流程3.实验结果4.实验小结 一、支持向量机简述 1.概念 支持向量机&#xff08;SVM&#xff09;是一类按监督学习方式对数据进行二元分类的广义线性分类器&#xff0c;其…

ONLYOFFICE深度解锁系列.4-OnlyOffice客户端原理-真的不支持多端同步

最近很多客户多要求直接部署onlyoffice服务端,还问能否和onlyoffice的客户端进行文件同步,当时真是一脸懵,还有的是老客户,已经安装了onlyoffice协作空间的,也在问如何配置客户端和协作空间的对接。由于问的人太多了,这里统一回复,先说结论,再说原理: 1.onlyoffice document s…

LLMTIME: 不用微调!如何用大模型玩转时间序列预测?

今天是端午节&#xff0c;端午安康&#xff01;值此传统佳节之际&#xff0c;我想和大家分享一篇关于基于大语言模型的时序预测算法——LLMTIME。随着人工智能技术的飞速发展&#xff0c;利用大型预训练语言模型&#xff08;LLM&#xff09;进行时间序列预测成为一个新兴且极具…