acme.sh + Cloudflare DNS 申请证书成功后完整后续步骤
前提:
--issue执行成功,已经拿到blog.myfamily2027.top、stockapi.myfamily2027.top两个域名的泛域名/多域名证书(dns_cf 就是Cloudflare DNS API方式)
证书默认路径:~/.acme.sh/blog.myfamily2027.top/
第1步:把证书安装复制到Nginx/Halo可读取目录(必须,不要直接引用acme.sh内部文件,acme会自动更新证书)
# 创建存放证书目录
mkdir -p /etc/ssl/myfamily2027
# 执行install-cert,这一步会自动注册证书续期钩子
~/.acme.sh/acme.sh --install-cert -d blog.myfamily2027.top \
--key-file /etc/ssl/myfamily2027/private.key \
--fullchain-file /etc/ssl/myfamily2027/fullchain.cer \
--reloadcmd "docker restart nginx"
--reloadcmd "docker restart nginx":证书自动续期成功后,自动重启nginx加载新证书;如果你不是docker版nginx,改成systemctl reload nginx- 执行完,
/etc/ssl/myfamily2027/就有私钥+完整证书链
第2步:验证证书文件是否生成
ls -l /etc/ssl/myfamily2027/
能看到 private.key、fullchain.cer 两个文件就是正常。
第3步:Nginx反向代理配置(Halo博客,原端口8090)
新建/修改nginx站点配置 blog.conf
server {
listen 80;
server_name blog.myfamily2027.top;
# http强制跳转https
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name blog.myfamily2027.top;
ssl_certificate /etc/ssl/myfamily2027/fullchain.cer;
ssl_certificate_key /etc/ssl/myfamily2027/private.key;
# ssl安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
location / {
proxy_pass http://127.0.0.1:8090; # Halo容器端口
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;
}
}
# stockapi子域名,如果你库管API用这个域名,可以单独配置
server {
listen 80;
server_name stockapi.myfamily2027.top;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name stockapi.myfamily2027.top;
ssl_certificate /etc/ssl/myfamily2027/fullchain.cer;
ssl_certificate_key /etc/ssl/myfamily2027/private.key;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
proxy_pass http://127.0.0.1:【这里填你的库管API端口】;
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;
}
}
第4步:检查Nginx配置语法,重载Nginx
# 检查配置
docker exec nginx nginx -t
# 重载配置(如果是宿主机nginx:nginx -t && systemctl reload nginx)
docker exec nginx nginx -s reload
⚠️ 服务器防火墙/安全组放行 80、443端口,关闭直接对外暴露的8090端口(安全重点!)
第5步:测试域名解析访问
- Cloudflare DNS把两个A记录解析到你VPS公网IP
blog.myfamily2027.topA记录 → VPS公网IPstockapi.myfamily2027.topA记录 → VPS公网IP
- 浏览器访问
https://blog.myfamily2027.top,查看地址栏小锁,证书正常即可。
第6步:设置自动续期(acme.sh默认自带定时任务)
# 查看定时任务
crontab -l
acme.sh安装时会自动添加crontab,默认每天0点自动检测证书,到期前自动更新证书,并且执行上面写的 --reloadcmd 重启nginx加载新证书。
手动测试续期命令(仅测试,不会强制更新):
~/.acme.sh/acme.sh --cron
第7步:Cloudflare额外建议(可选)
- Cloudflare面板 → SSL/TLS → 模式改为 Full(完全),不要Flexible
- 开启最小版本TLS1.2,关闭旧协议
安全重点提醒
✅ 完成后,VPS安全组直接关闭8090端口对外访问,只留80/443;外部全部走443反向代理访问Halo,不再直接暴露8090。