在生产建站和轻量后端服务部署中,实现稳健的VPS 网站 SSL 证书自动化与反向代理架构是保障站点安全与高可用的第一道防线。许多开发者因证书过期停机、Nginx 配置不当导致源站真实 IP 泄露,从而遭到恶意扫盘或 DDoS 穿透攻击。
本文基于现代安全标准,指导你使用开源神器 acme.sh 配合 DNS API 自动管理 ECC (Prime256v1) 证书,并在 Nginx 反向代理中联动 Cloudflare CDN,配合此前介绍的 Docker 小内存/小硬盘 VPS 规范运维 与 Linux VPS 开启 BBRv3 / BBR 拥塞控制调优实战,构建严密的建站网络边界。
一、使用 acme.sh 实现证书零宕机自动签发
相比传统的 Certbot HTTP 验证,通过 DNS API 进行 DNS-01 挑战无需开放外部 HTTP 端口,即使源站藏在 CDN 之后也能无缝续期:
# 1. 一键安装 acme.sh 并配置通知邮箱
curl https://get.acme.sh | sh -s [email protected]
source ~/.bashrc
# 2. 设置 Cloudflare API 令牌(或腾讯云/阿里云 DNS 密钥)
export CF_Token="your_cloudflare_api_token"
export CF_Zone_ID="your_zone_id"
# 3. 申请强效现代 ECC 证书(零交互,自动配置 DNS TXT 记录)
acme.sh --issue --dns dns_cf -d example.com -d "*.example.com" --keylength ec-256
二、Nginx 生产级安全反向代理配置
证书签发后,切勿直接引用 ~/.acme.sh/ 目录中的临时文件,应使用 --install-cert 命令将证书分发至安全目录并触发 Nginx 重载:
# 安装证书到生产系统目录
acme.sh --install-cert -d example.com --ecc \
--key-file /etc/nginx/ssl/example.com.key \
--fullchain-file /etc/nginx/ssl/example.com.cer \
--reloadcmd "systemctl reload nginx"
Nginx 反向代理核心配置模板
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.cer;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
# 严格安全响应头(启用 HSTS 与防嗅探)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
location / {
proxy_pass http://127.0.0.1:8080; # 后端 Docker 或服务容器端口
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
}
}
三、Cloudflare CDN 联动与源站真实 IP 防泄露
启用 CDN 代理(小黄云)后,必须关闭直接通过 IP 访问的能力,防止网络爬虫或扫描器探测到母机真实 IP:
- 配置默认 Default Server 丢弃请求:
nginx server { listen 80 default_server; listen 443 ssl default_server; ssl_reject_handshake on; # Nginx 1.19.4+ 支持拒绝未指定域名的握手 return 444; # 非法 Host 直接掐断 TCP 连接 } - UFW 防火墙仅放行 Cloudflare 节点:通过防火墙规则,限制公网仅允许 Cloudflare 官方公布的 IPv4/IPv6 网段访问 80/443 端口,彻底免疫直连扫盘。结合 VPS 自动化灾备实战:Rclone 加密备份,确保源站数据与配置双重安全。
四、排错与运维检查清单
- [ ] crontab 定时任务验证:确认
crontab -l中存在acme.sh --cron自动检查进程。 - [ ] 证书过期状态模拟:运行
acme.sh --cron --force演练证书签发与 Nginx 平滑热重载。 - [ ] 真实客户端 IP 获取:检查后端应用日志,确认
X-Forwarded-For显示的是真实访客 IP 而非 CDN 节点 IP。 - [ ] 端口安全审查:除 SSH 与必需的 Web 端口外,关闭所有数据库与内部调试端口对外直接暴露。
常见问答 FAQ
1. acme.sh 默认签发的是 ZeroSSL 还是 Let's Encrypt?
acme.sh 目前默认证书提供商为 ZeroSSL。如果你希望切换回 Let's Encrypt,可运行 acme.sh --set-default-ca --server letsencrypt 即可全局切换。
2. 网站开启 Cloudflare CDN 后提示“重定向过多 (ERR_TOO_MANY_REDIRECTS)”?
这是由于 Cloudflare 仪表盘中的 SSL/TLS 加密模式被设置成了 Flexible(CDN 到源站走明文 HTTP),而源站 Nginx 又开启了强制跳转 HTTPS 造成的循环重定向。在 Cloudflare 后台将加密模式修改为 Full 或 Full (Strict) 即可秒级解决。
评论