无域名情况下将Express.js部署到Amazon EC2并实现HTTPS访问
方案1:使用自签名证书
这是最直接的无域名方案,适合后端服务调用场景(前端浏览器会触发安全警告,但后端服务可通过忽略证书验证或导入信任证书解决)。
操作步骤:
生成自签名证书
在EC2实例上执行OpenSSL命令生成证书和密钥:openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes执行时按提示填写信息,Common Name可填EC2的Public IPv4 DNS或IP地址。
配置Express启用HTTPS
修改Express代码,替换默认的HTTP服务为HTTPS:const express = require('express'); const https = require('https'); const fs = require('fs'); const app = express(); // 加载证书文件 const sslOptions = { key: fs.readFileSync('./key.pem'), cert: fs.readFileSync('./cert.pem') }; // 示例路由 app.get('/api', (req, res) => { res.json({ status: 'success', message: 'HTTPS access enabled' }); }); // 启动HTTPS服务监听443端口 https.createServer(sslOptions, app).listen(443, () => { console.log('HTTPS server running on port 443'); });注:监听443端口需root权限,或执行
sudo setcap cap_net_bind_service=+ep /usr/bin/node给Node.js赋予端口绑定权限。客户端适配
- Node.js客户端调用时,可添加
rejectUnauthorized: false跳过证书验证(仅限内部/测试场景),或把自签名证书导入客户端信任库。 - 浏览器访问需用户手动信任证书。
- Node.js客户端调用时,可添加
方案2:使用AWS API Gateway作为HTTPS前端
AWS API Gateway提供默认HTTPS域名,可将EC2作为后端目标,无需自行注册域名。
操作步骤:
创建API Gateway
登录AWS控制台进入API Gateway服务,选择创建HTTP API(轻量型)或REST API:- 添加对应资源与方法(如GET/POST),集成类型选择「HTTP」,填写EC2的Public IPv4 DNS和内部HTTP端口(如80)。
部署API
将API部署到指定阶段(如prod),系统会生成默认HTTPS域名(格式类似https://xxxxxx.execute-api.eu-north-1.amazonaws.com/prod)。配置EC2安全组
允许API Gateway的IP段或所有IP访问EC2的HTTP端口(80)。测试访问
直接使用API Gateway生成的HTTPS域名调用接口,其他HTTPS网站可正常调用该域名,无证书或跨域问题。
方案3:使用AWS ACM私有CA签发证书
若需更正规的非自签名证书,可通过AWS ACM私有CA签发针对EC2 DNS或IP的证书,适合内部服务调用场景。
操作步骤:
创建私有CA
在AWS ACM控制台创建私有根CA或从属CA,完成证书颁发机构的配置与激活。签发目标证书
在ACM中请求证书,填写EC2的Public IPv4 DNS或IP地址,选择已创建的私有CA完成签发。配置EC2服务
将签发的证书与密钥下载到EC2实例(注意权限管控),配置Express或Nginx使用该证书。客户端信任配置
将私有CA的根证书导入客户端信任存储,避免调用时出现证书验证错误。
内容的提问来源于stack exchange,提问作者madfcat

