nodejs实现https://localhost在window系统自签名99年+授信

注意,授信必须在cmd的管理员模式下运行,如果重复授信,必须在【运行】里面输入【certmgr.msc】打开certmgr证书管理界面,然后找到【受信任的根证书颁发机构】-【证书】,找到【localhost】 ,删除后从新执行下面代码

// 引入所需模块
const https = require('https');
const fs = require('fs');
const forge = require('node-forge');
const { exec } = require('child_process');
const path = require('path');let certPem="";
let keyPem="";// 连接多个路径片段
const certPath = path.join(__dirname, 'ssl-cert.pem');
const keyPath = path.join(__dirname, 'ssl-key.pem');// 将证书添加到Windows信任存储的函数
function addCertificateToTrustStore(certPath) {const cmd = `certutil -addstore root ${certPath}`;exec(cmd, (error, stdout, stderr) => {if (error) {console.error(`执行错误: ${error}`);return;}if (stderr) {console.error(`stderr: ${stderr}`);return;}console.log(`stdout: ${stdout}`);});
}// 生成自签名证书函数
function generateSelfSignedCertificate() {const keys = forge.pki.rsa.generateKeyPair(2048); // 生成密钥对const cert = forge.pki.createCertificate(); // 创建证书对象cert.publicKey = keys.publicKey; // 设置公钥cert.serialNumber = '01'; // 序列号cert.validity.notBefore = new Date(); // 证书开始时间cert.validity.notAfter = new Date();cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 99); // 有效期1年// 设置证书主体信息const attrs = [{ name: 'commonName', value: 'localhost' },{ name: 'countryName', value: 'CN' },{ name: 'organizationName', value: 'MyCompany' },];cert.setSubject(attrs); // 证书主题cert.setIssuer(attrs); // 自签名,颁发者与主题一致// 添加扩展cert.setExtensions([{ name: 'basicConstraints', cA: true },{name: 'keyUsage',keyCertSign: true,digitalSignature: true,keyEncipherment: true,},{name: 'subjectAltName',altNames: [{ type: 2, value: 'localhost' }],},]);// 使用私钥对证书签名cert.sign(keys.privateKey, forge.md.sha256.create());// PEM 格式化密钥和证书const privateKeyPem = forge.pki.privateKeyToPem(keys.privateKey);const certPem = forge.pki.certificateToPem(cert);return { key: privateKeyPem, cert: certPem };
}if (!fs.existsSync(certPath) && !fs.existsSync(keyPath)) {console.log('证书或密钥文件不存在,正在生成...');// 保存证书到文件(可选)// 生成SSL证书const { key, cert } = generateSelfSignedCertificate();fs.writeFileSync(certPath, cert);fs.writeFileSync(keyPath, key);
// 调用函数,传入证书文件的路径addCertificateToTrustStore(certPath);certPem=cert;keyPem=key;
}else{console.log('证书和密钥文件已存在,正在读取...');// 读取证书和密钥文件certPem= fs.readFileSync(certPath, 'utf8');keyPem = fs.readFileSync(keyPath, 'utf8');
}setTimeout(function (){// 创建HTTPS服务器https.createServer({ key: keyPem, cert: certPem }, (req, res) => {res.writeHead(200, { 'Content-Type': 'text/plain' });res.end(`Hello, HTTPS===${Date.now()}`);}).listen(443, () => {console.log('HTTPS 服务器已启动:https://localhost');});},2000)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件项目体系建设文档,项目开发实施运维,审计,安全体系建设,验收交付,售前资料(word原件)

软件系统实施标准化流程设计至关重要,因为它能确保开发、测试、部署及维护等各阶段高效有序进行。标准化流程能减少人为错误,提升代码质量和系统稳定性。同时,它促进了团队成员间的沟通与协作,确保项目按时交付。此外,…

Java基础 注解

分类 Java自带的标准注解,包括Override、Deprecated和SuppressWarnings,分别用于标明重写某个方法、标明某个类或方法过时、标明要忽略的警告,用这些注解标明后编译器就会进行检查。元注解,元注解是用于定义注解的注解&#xff0…

Linux中rsync命令使用

一、rsync简介 rsync 是一种高效的文件复制和同步工具,常用于在本地或远程计算机之间同步文件和目录 主要特性增量同步:rsync 会检测源和目标文件之间的差异,只传输发生变化的部分,而不是重新传输整个文件。这样就能有效减少数据…

基于STM32的自动水满报警系统设计

目录 引言系统设计 硬件设计软件设计系统功能模块 水位检测模块报警模块自动控制模块控制算法 水位检测逻辑报警触发逻辑代码实现 水位检测模块报警控制模块自动控制逻辑系统调试与优化结论与展望 1. 引言 水满报警系统在家庭、农业、工业等领域广泛应用,通过实时…

【Java数据结构】二叉树

1.树型结构 1.1树的概念 树是一种非线性的数据结构,由n个结点组成的具有层次关系的集合。下面是它的特点: 根结点是没有前驱的结点(没有父结点的结点)子结点之间互不相交除了根结点外,其它结点都只有一个父结点n个结…

学习threejs,导入AWD格式的模型

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.AWDLoader AWD模型加…

Chapter4.3:Implementing a feed forward network with GELU activations

4 Implementing a GPT model from Scratch To Generate Text 4.3 Implementing a feed forward network with GELU activations 本节即将实现子模块,用于transformer block(变换器块)的一部分。为此,我们需要从激活函数开始。 深…

弥散张量分析开源软件 DSI Studio 简体中文汉化版可以下载了

网址: (63条消息) DSIStudio简体中文汉化版(2022年7月)-算法与数据结构文档类资源-CSDN文库

【信号滤波 (补充)】二阶陷波滤波代码推导过程(C++)

目录 二阶陷波滤波器计算实例一、 传递函数的参数推导1. 首先 b 0 , b 1 , b 2 b_0, b_1, b_2 b0​,b1​,b2​是怎么推导出来的?2. 带入实际值求解3. 验证上述的传递函数 二、将传递函数转化成差分方程2.1 传递函数写成输入输出形式2.2 Z域转化为时域 三、将差分方程…

C++进阶——用Hash封装unordered_map和unordered_set

目录 前言 源码怎么说 为什么要兼容? 兼容的具体做法? 为什么要把Key转为整数(HashFcn)? 模拟实现 一、建立框架 二、迭代器 运算符重载 迭代器兼容大法 三、[ ]重载 四、实现不能修改key 实现及测试代码 …

安装MySQL的五种方法(Linux系统和Windows系统)

一.在Linux系统中安装MySQL 第一种方法:在线YUM仓库 首先打开MySQL官网首页 www.mysql.com 找到【DOWNLOADS】选项,点击 下拉,找到 【MySQL Community(GPL) Downloads】 在社区版下载页面中,【 MySQL Yum Repository 】链接为在线仓库安装…

极客说|微软 Phi 系列小模型和多模态小模型

作者:胡平 - 微软云人工智能高级专家 「极客说」 是一档专注 AI 时代开发者分享的专栏,我们邀请来自微软以及技术社区专家,带来最前沿的技术干货与实践经验。在这里,您将看到深度教程、最佳实践和创新解决方案。关注「极客说」&am…

封装/前线修饰符/Idea项目结构/package/impore

目录 1. 封装的情景引入 2. 封装的体现 3. 权限修饰符 4. Idea 项目结构 5. package 关键字 6. import 关键字 7. 练习 程序设计:高内聚,低耦合; 高内聚:将类的内部操作“隐藏”起来,不需要外界干涉&#xff1b…

【C++】P5733 【深基6.例1】自动修正

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述💯解题思路概述💯第一种实现方式:直接使用字符ASCII值计算代码实现代码分析 💯第二种实现方式:直接修改…

【Elasticsearch】文档操作:添加、更新和删除

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

【insert 插入数据语法合集】.NET开源ORM框架 SqlSugar 系列

系列文章目录 🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀 文章目录 系列文章目录一、前言 🍃二、插入方式 💯2.1 单条插入实体2.2 批量 插入实体2.3 根据字典插入2.4 根据 Dat…

权限掩码umask

1 、 设置新建文件或目录的默认权限 在 Linux 系统中,当用户创建一个新的文件或目录时,系统都会为新建的文件或目录分配默认的权限,该默认权限与umask 值有关,其具体关系是: 新建文件的默认权限 0666-umask 值 新建…

202-01-06 Unity 使用 Tip1 —— UnityHub 模块卸载重装

文章目录 1 卸载模块2 更新配置文件3 重启 UnityHub 起因: ​ WebGL 平台打包程序报错,懒得修复了,因此粗暴地删了重装。但是 UnityHub 不支持卸载模块,因此手动配置。 1 卸载模块 ​ 以 Unity 6000.0.26f1c1 为例,其…

打造三甲医院人工智能矩阵新引擎(二):医学影像大模型篇--“火眼金睛”TransUNet

一、引言 1.1 研究背景与意义 在现代医疗领域,医学影像作为疾病诊断与治疗的关键依据,发挥着不可替代的作用。从传统的X射线、CT(计算机断层扫描)到MRI(磁共振成像)等先进技术,医学影像能够直观呈现人体内部结构,为医生提供丰富的诊断信息,涵盖疾病识别、病灶定位、…

国产编辑器EverEdit - 两种删除空白行的方法

1 使用技巧:删除空白行 1.1 应用场景 用户在编辑文档时,可能会遇到很多空白行需要删除的情况,比如从网页上拷贝文字,可能就会存在大量的空白行要删除。 1.2 使用方法 1.2.1 方法1: 使用编辑主菜单 选择主菜单编辑 …