使用 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 端口),可以直接使用已申请的证书文件。

步骤:

  1. 找到证书存放位置
    Certbot 自动配置后,证书通常在 /etc/letsencrypt/live/你的域名/,文件包括:

    • fullchain.pem(证书链)
    • privkey.pem(私钥)
  2. 给后端进程读取证书的权限
    后端进程通常以普通用户运行(如 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
    
  3. 配置后端使用 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,证书有效。

  4. 处理证书自动更新
    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 即可。需要更具体的命令或遇到问题,可以继续问我。

posted @ 2026-06-25 16:31  小南橙  阅读(35)  评论(0)    收藏  举报