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

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

JavaScript 复制代码
// 引入所需模块
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)
相关推荐
娅娅梨4 天前
HarmonyOS-ArkUI Web控件基础铺垫7-HTTP SSL认证图解 及 Charles抓包原理 及您为什么配置对了也抓不到数据
http·华为·ssl·harmonyos
影子24014 天前
java jdbc连接sqlserver2008R2版本数据库报错,驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接
java·数据库·ssl
土星碎冰机5 天前
数据库开启ssl
数据库·网络协议·ssl
weixin_507847955 天前
Nginx SSL/TLS 配置
网络·nginx·ssl
站长朋友5 天前
什么是OCSP装订(OCSP Stapling)?它如何加速SSL握手?
网络·网络协议·ssl·ocsp装订·https握手优化·tls扩展配置·ssl证书国内节点
云和数据.ChenGuang5 天前
java常见SSL bug解决方案
java·bug·ssl
网硕互联的小客服6 天前
SSL部署完成,https显示连接不安全如何处理?
ssl·httpx
吠品6 天前
自动化SSL证书管理:应对域名SSL证书更新焦虑
运维·自动化·ssl
提笔忘字的帝国6 天前
宝塔SSL自动续签
网络·网络协议·ssl
sun03226 天前
使用 javax.net.ssl.HttpsURLConnection 发送 HTTP 请求_以及为了JWT通信选用OSS的Jar的【坑】
http·.net·ssl