如何让一台新服务器快速挂上可信的 HTTPS?这篇文章能帮你把整条链路一次走通。我的测试环境是一台 VPS(Virtual Private Server,虚拟专用服务器),系统 Ubuntu 22.04,Nginx 1.24,DNS(Domain Name System,域名解析系统)已经生效。实际踩一遍就会发现:签发方式选错、验证文件放错目录、防火墙没放行 80 端口,任何一个环节都能卡住半天。下文记录了我从零开始用 Certbot(Let’s Encrypt 官方推荐的签发工具)完成签发、部署、自动续期的全过程,帮助准备动手的朋友避开这些坑。
签发前的准备:域名解析与 Web 服务器状态检查
先说结论:签发失败的八成原因出在准备阶段。我在测试机上复现过一次典型失败——域名 A 记录指向旧 IP,HTTP-01 验证直接报 connection refused。
动手签发前,建议按这个顺序逐项确认:
- 用
dig +short yourdomain.com确认解析结果与服务器公网 IP 一致 - 用
curl -I http://yourdomain.com确认 80 端口能从公网访问 - 检查
nginx -t输出无报错,server_name与申请证书的域名完全一致 - 确认
ufw status或云主机的安全组已放行 80 和 443 端口
四步全部通过后再签发,基本就是一条命令的事;跳过检查直接上,报错时顺着 Certbot 输出看是解析没生效还是端口没开即可。

看上面这张对比图:同一台服务器,部署证书前后浏览器给出的连接状态完全不同。Chrome 已把不带证书的站点直接标记为「不安全」,这一步没有商量余地。
签发与部署:Certbot 全流程命令实测
准备就绪后,先安装 Certbot 和 Nginx 插件:
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
然后执行签发命令。我实际用的是:
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
Certbot 验证域名归属后会自动修改 Nginx 配置,把 80 端口请求 301 到 443。我全程不到两分钟,证书落在 /etc/letsencrypt/live/yourdomain.com/ 下,关键是 fullchain.pem(完整证书链)和 privkey.pem(私钥)。
有几个实测细节值得单独说:
- 选「Redirect」后建议
cat一下 Nginx 配置,确认 301 规则符合预期 - 证书链不完整是常见的部署错误,浏览器报证书不受信任但
curl正常,多半就是只部署了站点证书没带中间证书,fullchain.pem就是为了避免这个问题 - 如果你的 Web 服务器不是 Nginx 而是 Apache,把插件换成
python3-certbot-apache即可,流程完全一样 - 泛域名证书(
*.yourdomain.com)必须用 DNS-01 验证,需要配合域名的 API 自动化,HTTP 验证签不下来

这张图就是完整签发链路:服务器向签发机构(CA,Certificate Authority)申请,CA 验证域名控制权后发下证书,客户端访问时沿这条信任链校验真伪。理解它,排查「证书不受信任」类报错就有方向了。
自动续期配置与实测验证
Let’s Encrypt(免费证书签发机构)的证书有效期只有 90 天,用短有效期倒逼自动化。不建议人肉续期——我见过不止一个站点忘了续期,客户看到过期提示以为是钓鱼网站直接跑了。
Certbot 安装时通常会自带一个 systemd timer(定时器),先确认它是否在跑:
systemctl list-timers | grep certbot
sudo certbot renew --dry-run
--dry-run 是关键:它用测试环境完整模拟一次续期流程,不会消耗正式签发额度。我的测试机返回 Congratulations, all simulated renewals succeeded,说明自动续期链路是通的。如果这一步失败,大概率是验证端口被防火墙拦了,或者 80 端口被别的服务占用。
生产环境再加一层保险,用 cron(定时任务)每周检查证书有效期:
0 9 * * 1 certbot renew --quiet --deploy-hook "systemctl reload nginx"
这条命令静默尝试续期,成功后自动 reload Nginx 让新证书立即生效。不加 --deploy-hook 的话,Nginx 要等重启才加载新证书,中间会出现证书已更新但线上仍旧的尴尬状态。
从主机商面板申请的商业证书续期机制完全不同,一般是面板自动处理或邮件提醒确认,可参考美国服务器租用常见术语一篇搞懂先分清证书类型再选续期方案。
部署后的检查清单与常见故障排查
部署完不等于万事大吉,按这套清单过一遍:
- 用
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com | head检查证书链是否完整 - 用
curl -I https://yourdomain.com确认返回HTTP/2 200,且 80 端口请求被 301 到 HTTPS - 在浏览器里打开站点,点击地址栏的锁图标查看证书有效期和域名是否匹配
- 用 SSL(Secure Sockets Layer,安全套接层)评级网站之类的在线检测工具跑一次评级,目标 A 以上,如果只有 B 或 C,多半是协议版本或加密套件配置偏旧
- 检查页面里有没有
http://开头的混合内容引用,图片、JS 走明文 HTTP 会让浏览器仍然标记不安全
实测最后一个坑是混合内容:证书正常但 Chrome 依旧提示不安全,排查发现一张背景图还挂着 http:// 老地址,改成相对路径立刻恢复。老站点迁移时这类问题特别常见。
续期突然失败时按顺序查三件事:letsencrypt.log 最近一次失败详情、域名解析是否变动、80 端口能否公网访问,九成故障到此即可定位。
总结:一套可以照抄的部署策略
整套流程收拢一下:签发前确认解析和端口,签发时 Certbot 一条命令搞定,签发后 --dry-run 验证续期,再配带 --deploy-hook 的 cron 兜底。我在测试机上从零到全绿不到二十分钟。
总结几条建议:生产环境证书自动化必须做;证书链和混合内容检查纳入固定动作;如果用的是虚拟主机或不想折腾命令行,Hostease 的虚拟主机和 VPS 在面板里内置一键 HTTPS 部署,配合中文工单对新手更省心。
延伸阅读
最后给一条可以直接执行的行动建议:如果你需要现在就把 HTTPS 部署落地,可以考虑按本文第二、三节的命令顺序在测试机上完整跑一遍,再照第四节清单验收,总结下来全程不会超过半小时。




