免费SSL证书:Let's Encrypt自动续期
网站HTTPS必备:Let's Encrypt免费SSL证书申请、Nginx配置、自动续期一次讲透,附常见报错排查,新手跟着做就行。
我是小够。今天讲建站绕不开的一件事:SSL 证书。浏览器地址栏那把小锁,没有它,你的网站在 Chrome 里会被标"不安全",访客扭头就走。好消息是:Let’s Encrypt 提供完全免费的证书,申请加自动续期,跟着这篇做,半小时搞定。
先搞懂三个概念
SSL/TLS 证书:证明"这个网站真的是它声称的那个网站",同时加密浏览器和服务器之间的数据。没有它,访客输入的密码、表单数据都是明文传输。
Let’s Encrypt:一家非营利证书颁发机构,免费签发证书,全球网站都在用。唯一的"代价"是证书有效期只有 90 天——所以必须配自动续期,手动续一年 4 次,会疯。
ACME 协议:自动申请、验证、续期的协议。Certbot 这类工具就是 ACME 的客户端,你不用管协议细节,会用工具就行。
准备工作
开始前确认三件事:
- 域名已经解析到你的 VPS:
ping 你的域名,返回的 IP 是你的服务器 IP。没解析好,后面的验证一步都过不去。 - 80 端口是通的:Let’s Encrypt 验证域名所有权时,会访问你服务器的 80 端口。防火墙、云服务商的安全组,先把 80 和 443 放行。
- 装了 Nginx 或 Apache:这篇以 Nginx 为例,Apache 思路一样,命令略有不同。
第一步:安装 Certbot
Debian/Ubuntu 一行命令:
apt update && apt install -y certbot python3-certbot-nginx
装完验证一下:certbot --version,能输出版本号就是装好了。
第二步:申请证书
假设你的域名是 example.com,Nginx 已经配好网站并能正常访问,执行:
certbot --nginx -d example.com -d www.example.com
Certbot 会做四件事:向 Let’s Encrypt 证明你拥有这个域名、签发证书、自动改好 Nginx 配置(加上 443 监听和证书路径)、问你要不要把 HTTP 跳转到 HTTPS(选 yes)。
看到 “Congratulations!” 就是成功了。现在用浏览器打开 https://你的域名,小锁应该已经出现了。
第三步:自动续期(最重要的一步)
证书 90 天过期,Let’s Encrypt 推荐 60 天就续。Certbot 安装时一般会自动配好定时任务,检查一下:
systemctl list-timers | grep certbot
能看到 certbot.timer 就是配好了。它每天会运行两次,检查证书是否快过期,快了就自动续,Nginx 配置自动重载,全程不用你动手。
手动验证续期流程是否正常(不会真的续,只是演练):
certbot renew --dry-run
演练通过,这一步就彻底放心了。建议把这条命令加入你的"新机器初始化清单",以后每台建站机器都跑一遍。
通配符证书:一个证书管所有子域名
如果你有很多子域名(a.example.com、b.example.com……),可以申请通配符证书 *.example.com,一个证书全搞定。但通配符证书不能用上面的 HTTP 验证,必须用 DNS 验证:
certbot certonly --manual --preferred-challenges dns -d example.com -d *.example.com
Certbot 会给你一条 TXT 记录,叫你去域名 DNS 解析里加上,加完按回车继续。注意:手动 DNS 验证不能自动续期,每 90 天要手动来一次。想全自动,得用支持你域名 DNS 商 API 的插件——这是进阶玩法,子域名不多的话,老老实实给每个子域名单独申请更省心。
常见报错排查
报错:连接超时 / 验证失败。 十有八九是 80 端口没放行,或者域名没解析到这台机器。先 ping 域名确认 IP,再检查防火墙和安全组。
报错:申请次数超限。 Let’s Encrypt 限制每个域名每周最多申请 5 张证书。测试时先用 --dry-run 演练,或者申请测试环境的证书,别拿正式环境反复试。
续期后浏览器还是显示旧证书。 Nginx 没重载。手动 nginx -s reload 一下,然后检查定时任务里的重载钩子配没配。
证书链不完整(某些老设备报错)。 一般是 Nginx 配置里只写了 cert.pem 没写 fullchain.pem。Certbot 自动配的不会有这个问题,手动配的一定要用 fullchain.pem。
安全提醒
证书文件在 /etc/letsencrypt/ 目录下,私钥(privkey.pem)千万别泄露、别传到 GitHub、别截图发群。泄露了立刻吊销重签。另外,免费证书和付费证书在加密强度上没有区别,付费证书多的是保险和"企业验证"的面子——个人博客、小电商站,Let’s Encrypt 完全够用,这就是够用主义。
Apache 用户怎么配
用 Apache 的话,装对应的插件:
apt install -y certbot python3-certbot-apache
certbot --apache -d example.com -d www.example.com
流程和 Nginx 版一模一样:验证域名、签发证书、自动改配置、自动续期。Apache 的配置文件在 /etc/apache2/sites-available/,Certbot 会自动加上 SSL 相关的 VirtualHost,不用手写。
宝塔面板用户:一键申请
如果你用的是宝塔面板,连命令行都不用进:网站设置 → SSL → 申请 Let’s Encrypt 证书,填域名、点申请,面板自动完成验证和配置,续期也是自动的。宝塔还支持 DNS 验证方式的通配符证书(需要填域名 DNS 商的 API 密钥)。
小够的看法:面板一键申请适合新手和"不想碰命令行"的人,省心;但建议至少看懂这篇前面的原理——面板出问题的时候,你才知道去哪找原因。
续期失败排查清单
自动续期配好了,不代表永远没事。续期失败最常见的四个原因,按顺序查:
- 80 端口被墙了:续期验证要走 80 端口。检查防火墙、云安全组,有没有人手贱把 80 关了。
- Nginx 配置被改坏了:
nginx -t测试配置,有 error 先修好再续。Certbot 续期时会重载 Nginx,配置错了就续不上。 - 域名解析变了:域名过期、解析被改、CDN 回源 IP 变了,验证都会失败。
ping一下域名确认。 - 服务器时间不对:系统时间漂移太大,ACME 验证会失败。
timedatectl看一眼,NTP 同步开着没(时区那篇讲过)。
排查命令一条龙:
certbot renew --dry-run # 演练,看报什么错
nginx -t # 检查 Nginx 配置
systemctl status certbot.timer # 确认定时任务活着
每年抽查一次这套流程,5 分钟,换一年安心。
开了 HTTPS,别忘了 HTTP/2
证书配好只是第一步,Nginx 开 HTTP/2,网站速度还能再上一个台阶:
listen 443 ssl http2;
HTTP/2 多路复用,一个连接并行传多个文件,图片多的网站打开速度提升明显。Certbot 新版本自动配的一般已经带了 http2,检查一下配置文件确认。HTTP/3 需要 QUIC,配置复杂些,个人站不急。
HSTS:进阶但要小心
HTTP Strict Transport Security(HSTS)是告诉浏览器"这个站以后只用 HTTPS 访问",能防中间人劫持。Nginx 加一行:
add_header Strict-Transport-Security "max-age=31536000" always;
但小够要泼盆冷水:开了 HSTS,HTTP 就彻底回不去了。如果你的站还有部分页面只能走 HTTP(比如某些老旧内嵌资源),开了 HSTS 这些页面直接挂。而且 includeSubDomains 参数会把所有子域名一起锁死,子域名还没配 HTTPS 的千万别加。个人博客开了没问题,复杂站点先在测试环境验证。
多台服务器怎么用证书
业务做大了,一台变三台,证书怎么办?三个方案:
- 每台单独申请:最简单,但要注意 Let’s Encrypt 的频率限制(同一域名每周 5 张),机器多了会撞墙。
- 一台申请,多台同步:在一台机器上申请,用 rsync/scp 把
/etc/letsencrypt/同步到其他机器,续期后自动同步。这是小团队最常用的方案。 - CDN 统一托管:CDN 回源多台服务器,访客只看到 CDN 的证书,源站证书各自维护。这是大流量的标准架构。
个人站和中小站,方案 1 或 2 完全够用,别一上来就搞复杂的。
从 HTTP 迁到 HTTPS:检查清单
老站从 HTTP 切 HTTPS,按这个清单走一遍,不留死角:
- 证书申请成功,
https://能打开,小锁正常。 - 全站 HTTP 301 跳转到 HTTPS(Certbot 选 yes 就自动配了)。
- 站内所有资源(图片、CSS、JS)改成 HTTPS 或相对路径——混入一个 HTTP 资源,浏览器就报"不安全"。
- 第三方嵌入(统计代码、广告、字体)确认支持 HTTPS。
- sitemap 里的链接全换成 HTTPS,搜索引擎重新收录。
- HSTS 先别开,稳定跑一个月再说(前面讲过原因)。
最常见的翻车是"混合内容":页面是 HTTPS,某张图片是 HTTP。浏览器按 F12 看控制台,一个个改掉。WordPress 用户可以用插件批量替换数据库里的旧链接,改完备份一次数据库。
证书到期前的告警:别裸奔
自动续期配好了,但"万一"总会发生。加一道保险:监控证书有效期。
最简单的办法:用 Uptime Kuma(本站推荐过的监控工具)添加"证书监控",到期前 14 天发通知。或者写个 cron 脚本,每天检查证书剩余天数,少于 20 天就发邮件:
openssl x509 -enddate -noout -in /etc/letsencrypt/live/你的域名/fullchain.pem
这条命令输出证书到期时间,脚本里解析一下就行。监控的钱(时间)不能省——证书过期导致全站"不安全",丢的访客比你配监控花的 10 分钟贵得多。
证书和 CDN 一起用:架构图
流量大了上 CDN,证书架构变成两段:
访客 --(CDN的证书)--> CDN --(你服务器的证书)--> 源站
两段都要配 HTTPS,缺一段都不行。CDN 那段一般在 CDN 控制台一键申请免费证书;源站这段就是这篇讲的 Let’s Encrypt。回源记得用 HTTPS 回源,别图省事用 HTTP——中间那段是公网,明文传输等于裸奔。
另外,CDN 的证书和源站的证书互相独立,过期时间不一样,监控要两边都做。别只盯着源站,CDN 证书过期了一样全站报错。
Let’s Encrypt 的频率限制:别撞墙
免费不是无限,Let’s Encrypt 有几条频率限制,撞了要等一周:
- 同一域名每周最多 5 张证书:测试时用
--dry-run演练,别拿正式环境反复试。 - 每周最多 300 个新订单:个人用户碰不到,企业批量申请才要注意。
- 失败验证每小时 5 次:配错了连试 5 次,第 6 次要等一小时。报错先看日志,别闷头重试。
撞墙的表现是明确的报错信息,按提示等就行。急着上线?先用自签证书顶着,或者换一台机器申请——限制是按域名算的,不是按机器。
证书吊销:私钥泄露了怎么办
私钥泄露(传到 GitHub、发群里、备份外泄),第一时间吊销证书:
certbot revoke --cert-path /etc/letsencrypt/live/你的域名/cert.pem
然后重新申请一张。吊销是免费的,别心疼。教训:私钥文件权限设 600,只让 root 读;备份时排除 /etc/letsencrypt/,或者加密备份。很多人的私钥泄露都是"备份传到网盘"这种低级失误。
证书透明度:你的域名是公开的
申请 Let’s Encrypt 证书后,域名会被记录在公开的证书透明度(CT)日志里,任何人都能查到。这意味着:别指望用证书隐藏子域名。想搞"隐秘"的测试域名不被发现?不存在的,申请证书那一刻就公开了。这是设计使然,不是漏洞。
OCSP Stapling:让小锁更快
浏览器验证证书是否被吊销,要去查 OCSP 服务器,多一次网络请求,拖慢握手。OCSP Stapling 让服务器定期自己去查、把结果"钉"在握手里发给浏览器,省掉这一次请求。
Nginx 开启很简单:
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 valid=300s;
Certbot 自动配的一般已经开了,检查一下配置文件确认。效果:HTTPS 握手快几十毫秒,积少成多。个人站感知不强,但配置零成本,开了不亏。
证书和 SEO:HTTPS 是加分项
搜索引擎早就把 HTTPS 列为排名信号,Chrome 对 HTTP 页面标"不安全"更是直接劝退访客。所以 SSL 证书不只是安全问题,是流量问题。新站上线第一天就把 HTTPS 配好,别等收录了再迁——迁移过程中的排名波动,能避就避。
常见问题
Q:免费证书和付费证书有区别吗?
A:加密强度没有区别,浏览器都认同一把小锁。区别在:付费证书有效期更长(最长 1 年)、带保险、有 OV/EV 企业验证(地址栏显示公司名,个人站用不上)。个人博客和中小网站,免费证书完全够用。
Q:证书 90 天一续,会不会哪天忘了导致网站报错?
A:配好自动续期就不用记。Certbot 的定时任务每天检查两次,60 天就自动续。唯一的风险是:你改了 Nginx 配置、换了防火墙规则,导致续期验证失败——所以每年抽查一次 certbot renew --dry-run,5 分钟买个安心。
Q:一台服务器多个网站,怎么配证书?
A:每个域名单独跑一遍 certbot --nginx -d,Certbot 会给每个站点配独立的证书和续期,互不干扰。也可以一张证书带多个 -d 域名,省事,但其中一个域名出问题会影响整张证书的续期。
Q:CDN 后面还需要服务器上装证书吗?
A:需要。CDN 到访客之间是 CDN 的证书,CDN 回源到你的服务器之间,还需要你服务器上的证书,否则回源链路是明文的。两段都要加密,才是完整的 HTTPS。
Q:Let’s Encrypt 会不会哪天收费?
A:截至撰写时,Let’s Encrypt 明确承诺永久免费,它是非营利机构,靠大厂赞助运营,已经稳定运行十多年。退一步说,就算有变故,市面上还有其他免费 ACME 证书商,迁移成本很低,不用焦虑。