使用 Let's Encrypt 为服务器配置https证书,后端如何走433端口访问
我想使用 Let’s Encrypt 为我的服务器配置https证书 现在有个问题是 我的前端页面在80端口 它可以通过 Let’s Encrypt 自动配置证书 但是我的后端服务器在8080端口,我该怎么做为后端增加https
你遇到的情况很典型,通常我们不会让后端服务直接暴露 HTTPS 端口,而是通过反向代理统一处理 SSL,再转发给后端。这样更安全、证书管理也更简单。
因为你已经用 Let’s Encrypt 为前端(80 端口)自动配置了证书,说明证书文件已经存在服务器上,可以直接复用。下面给你两种方法,推荐第一种。
方案一:用 Nginx/Apache 反向代理(推荐)
原理:让 Nginx 或 Apache 在 443 端口处理 HTTPS,把 /api 之类的路径代理到本地的 8080 端口。后端保持 HTTP,证书只在前端代理层管理。
假设你的域名为 example.com,已经用 Certbot 自动配置了 Nginx,证书在 /etc/letsencrypt/live/example.com/。
在现有 Nginx 配置(通常在 /etc/nginx/sites-available/example.com 或 default)中的 server 块增加一个 location:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# 前端静态文件
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# 将 /api/ 的请求转发到 8080 端口的后端
location /api/ {
proxy_pass http://localhost:8080/;
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.com/api/xxx,不再需要指定 :8080。这就统一了端口,也避免了跨域问题。
安全性增强:用防火墙(如 ufw)关闭 8080 端口的公网访问,只允许本地访问:
sudo ufw allow 443/tcp
sudo ufw deny 8080/tcp # 如果之前开放了
方案二:让后端直接监听 HTTPS 端口
如果你想让后端程序自己处理 SSL(例如监听 8443 端口),可以直接使用已申请的证书文件。
步骤:
-
找到证书存放位置
Certbot 自动配置后,证书通常在/etc/letsencrypt/live/你的域名/,文件包括:fullchain.pem(证书链)privkey.pem(私钥)
-
给后端进程读取证书的权限
后端进程通常以普通用户运行(如node、www-data),无法直接读取/etc/letsencrypt/live下的私钥。安全做法是将证书复制出来并调整权限(不推荐直接修改原目录权限):sudo cp /etc/letsencrypt/live/example.com/fullchain.pem /opt/myapp/certs/ sudo cp /etc/letsencrypt/live/example.com/privkey.pem /opt/myapp/certs/ sudo chown -R 你的后端用户 /opt/myapp/certs/ sudo chmod 600 /opt/myapp/certs/*.pem -
配置后端使用 HTTPS
以 Node.js 为例:const https = require('https'); const fs = require('fs'); const options = { key: fs.readFileSync('/opt/myapp/certs/privkey.pem'), cert: fs.readFileSync('/opt/myapp/certs/fullchain.pem') }; https.createServer(options, app).listen(8443);之后后端访问地址变为
https://example.com:8443,证书有效。 -
处理证书自动更新
Let’s Encrypt 证书 90 天有效,Certbot 自动续期后,你复制过的证书不会自动更新。需要设置续期钩子(renewal hook),在证书更新后重新复制并重启后端。编辑 Certbot 续期配置文件(通常在
/etc/letsencrypt/renewal/example.com.conf),在[renewalparams]下添加:renew_hook = cp /etc/letsencrypt/live/example.com/fullchain.pem /opt/myapp/certs/ && cp /etc/letsencrypt/live/example.com/privkey.pem /opt/myapp/certs/ && systemctl restart mybackend或者使用
--deploy-hook编写脚本。
两个方案的对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| 反向代理 | 证书集中管理、续期简单、端口统一、安全性高 | 需要修改前端请求地址(不再带 8080) |
| 后端直接 HTTPS | 后端独立,不依赖前端代理 | 需处理证书复制、权限、续期钩子,增加维护复杂度;端口不同可能引起跨域 |
非常推荐使用反向代理,这也是生产环境的标准做法。你可以在原 443 端口的配置下,通过路径区分前后端,证书完全不用动。如果有其他子域名(如 api.example.com)的需求,也可以用 Certbot 申请多域名证书或单独证书,再配合 proxy_pass 到 8080。
如果你目前用的不是 Nginx 而是 Apache,原理相同,用 ProxyPass 即可。需要更具体的命令或遇到问题,可以继续问我。

浙公网安备 33010602011771号