如何为NodeJS服务器添加SSL(HTTPS)并改造现有Express代码
将Express服务器切换为HTTPS运行的修改方案
步骤1:准备SSL证书
确保你拥有SSL证书文件:通常包含cert.pem(公钥证书)和key.pem(私钥)。可以通过免费的Let's Encrypt获取生产环境证书,或者用OpenSSL生成自签名证书用于本地测试。将这两个文件放在项目的某个目录下,比如./ssl/。
步骤2:修改代码实现HTTPS服务
以下是修改后的完整代码,关键改动已标注:
const pino = require('pino') const { Boom } = require('@hapi/boom') const fs = require('fs') const chalk = require('chalk') require('dotenv/config') const express = require('express') const socket = require("socket.io"); const { toDataURL } = require('qrcode') const mysql = require('mysql'); require('dotenv').config(); const request = require('request'); const { smsg } = require('./app_node/lib/myf') // 新增:引入Node.js内置的https模块 const https = require('https'); const app = express() const host = process.env.HOST // 新增:可在.env中配置HTTPS端口,默认用443(HTTPS标准端口) const httpsPort = parseInt(process.env.HTTPS_PORT) || 443 // 新增:读取SSL证书文件 const sslOptions = { cert: fs.readFileSync(process.env.SSL_CERT_PATH || './ssl/cert.pem'), key: fs.readFileSync(process.env.SSL_KEY_PATH || './ssl/key.pem') } app.use(express.urlencoded({ extended: true })) app.use(express.json()) // 修改:用https.createServer创建服务器,替代原来的app.listen const ser = https.createServer(sslOptions, app).listen(httpsPort, host, () => { console.log(`Server is listening on https://${host}:${httpsPort}`) }) // Socket.IO依然依附在HTTPS服务器上,无需额外改动 const io = socket(ser);
补充说明
- 如果使用自签名证书,浏览器会提示不安全,这是正常现象,仅用于开发测试;生产环境必须使用受信任的CA颁发的证书。
- 可以把证书路径、HTTPS端口配置在
.env文件中:HOST=0.0.0.0 HTTPS_PORT=443 SSL_CERT_PATH=./ssl/fullchain.pem SSL_KEY_PATH=./ssl/privkey.pem - 如果需要同时支持HTTP和HTTPS,可以保留原来的
app.listen()(监听80端口),同时创建HTTPS服务器,不过生产环境建议将HTTP请求重定向到HTTPS。
内容的提问来源于stack exchange,提问作者Dimas Cornellya Agatta
相关产品推荐
相关产品推荐

