如何配置Node.js使用已有SSL证书(共享主机无root权限场景)
问题解决方法
方案1:使用现有Web服务反向代理(优先推荐,无需修改Node代码、无需触碰证书文件)
共享主机的主站已经配置好了HTTPS证书,直接用主站的Web服务(一般是Nginx/Apache)新增反向代理规则即可,不需要修改现有Node服务的任何代码,也不需要读取系统级证书文件。
Nginx配置示例如下,你可以直接在主机面板的自定义站点配置入口添加:
location /node-service/ { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
配置完成后直接通过https://example.net/node-service/就能访问你的Node服务,全程走HTTPS,也不用单独给3000端口配置证书。如果想用单独域名访问,直接新增一个站点绑定目标域名,配置里全量反向代理到3000端口即可。
方案2:直接给Node服务启用HTTPS
如果你确实需要直接让3000端口走HTTPS,按照以下步骤操作:
- 先解决证书文件访问问题
没有root权限不要用/etc/letsencrypt/下的系统路径,两种方式获取可用的证书:
- 查看共享主机面板的SSL证书管理页,一般会提供证书文件下载入口,把证书、私钥、链证书下载后上传到你自己用户目录下的可读路径(比如
~/ssl/) - 用无root权限的ACME脚本申请新的证书,存到自己的用户目录下,全程不需要root权限
- 修改现有Node服务代码,替换原有HTTP服务为HTTPS服务
完整修改后代码如下:
const fs = require("fs"); const app = require("express")(); // 读取你自己目录下的证书文件,路径替换成实际存储路径 const certificate = { key: fs.readFileSync('/home/你的用户名/ssl/privkey.pem'), cert: fs.readFileSync('/home/你的用户名/ssl/cert.pem'), ca: fs.readFileSync('/home/你的用户名/ssl/chain.pem') }; // 把原来的http.createServer替换为https.createServer const httpsServer = require("https").createServer(certificate, app); app.get('/', function (req, res, next) { res.sendFile(__dirname + '/index.html'); }); // 监听对应端口 httpsServer.listen(3000, () => { console.log('HTTPS服务运行在端口3000'); });
配置完成后启动服务,就能通过https://example.net:3000访问了。
内容的提问来源于stack exchange,提问作者Cain Nuke
相关产品推荐
相关产品推荐

