1. 从“证书自由”聊起:为什么我盯上了 Let‘s Encrypt
2017 年我第一次给个人站配 HTTPS 时,在证书商那儿花了 599 块买了一年的单域名证书。当时觉得这钱花得值,毕竟浏览器一绿,安全感直接拉满。结果第二年续费短信弹出来,价格变成了 1299,我盯着屏幕上那行“SSL 证书费用”看了半天,突然意识到一件事:我们买的根本不是加密能力本身,而是“省事”和“品牌背书”。
后来换工作到了做 SaaS 的公司,手里管着几十个域名,有客户的、有内部的、有测试环境的。每年到续费季,财务那边跑过来问“为什么证书费又涨了”,我就得把每一张证书的用途、域名、有效期、采购渠道重新盘一遍。那个痛苦,只有运维人能懂。更离谱的是,有些子域名只是内部系统临时用一下,也得按年续费,完全是在烧钱。
真正让我下决心切换到 Let‘s Encrypt 的,是一个周末的下午。我帮朋友迁移一台阿里云 ECS,上面挂着一个企业官网,用的是某云厂商的付费证书,还有两周到期。后台续费界面写得明明白白:一年 1680 元。我打开 Let’s Encrypt 官网看了一眼,心里那个数字瞬间变成了零。于是我当场用 Certbot 给他配好了证书,全程大概 15 分钟,之后顺手加了个自动续期任务,那天之后再也没管过证书的事。到现在两年多了,那张证书一直在自动生效,没花过一分钱。
这篇文章我就把整套方案掰开揉碎讲清楚。不管你是个人站长、小团队运维,还是手里管着几十个域名的“证书管理员”,只要能接受每 90 天自动续期这个设定,Let‘s Encrypt 基本就是你的最优解。我会从原理、工具选型、实操步骤、常见坑位、兼容性几个维度展开,尽量做到拿起来就能用。
Let’s Encrypt 的两个关键词:免费和自动化。免费意味着成本归零,自动化意味着摆脱“手工换证书”这个耗时耗力的脏活。下文所有内容都围绕这两个核心价值展开。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 先搞清楚 Let‘s Encrypt 到底在做什么
2.1 免费背后的技术逻辑:ACME 协议
很多人一听到“免费证书”会下意识怀疑安全性,觉得“不要钱的肯定不靠谱”。这个直觉可以理解,但从技术上讲,免费和加密强度没有任何关系。证书的作用是“证明你是你”,加密用的是公钥密码学那套机制,而签发证书的权威机构(CA)只是在背后帮你做一个身份确认。Let’s Encrypt 是 Linux 基金会赞助、Mozilla 等大厂背书的一个开源 CA,它的加密强度和那些卖几千块的商业证书完全相同,用的都是 2048 位 RSA(或 ECDSA)证书链,浏览器一样显示小锁。
那它凭什么能免费?关键在于签发环节的自动化。传统商业证书靠人工审核域名所有权,人工成本高,所以收费高。Let‘s Encrypt 把验证流程完全自动化,靠一套名为 ACME(Automatic Certificate Management Environment)的协议完成“服务器自己证明域名归自己所有”这个动作。本质上就是让服务器程序和 CA 之间做几轮自动握手,CA 确认你能控制某个域名后,就直接签发证书。
2.2 两种验证方式:HTTP-01 与 DNS-01
ACME 协议里最常用的两种验证方式,拿生活类比,就是“邮递员上门查水表”和“公示备案”。
HTTP-01 验证逻辑很直接:CA 给你的域名下发一个随机 token,要求你的 Web 服务器在 http://你的域名/.well-known/acme-challenge/那个token 这个路径上返回指定内容。如果你的服务器能返回正确结果,说明你确实控制着这个域名的网站文件。这个方法适合域名解析已经指向服务器、80 端口能正常访问的场景,配置简单,Certbot 等工具可以全自动处理。
DNS-01 验证逻辑更是简单粗暴:CA 要求你在域名的 DNS 记录里添加一条特定的 TXT 记录,添加完成后 CA 去查这条记录,查到了就证明你对域名有控制权。这个方法天然支持通配符域名(*.example.com),因为 CA 不可能跑遍每一台子服务器去验证。代价是你需要能自动操作 DNS 服务商的 API,或者接受“创建证书时手动加一条 TXT 记录”这个额外步骤。
这两种方式的选择直接影响了自动化程度和通配符支持,后半段讲实操的时候我会具体展开。
2.3 三个月有效期的真实意义:安全优先于方便
Let‘s Encrypt 把证书有效期设定为 90 天,这被很多人吐槽过“太折腾”。但从安全角度看,短有效期其实是一个刻意设计。证书有效期越长,一旦私钥泄露,攻击者可以滥用这个“合法身份”的时间就越长。证书被吊销后,浏览器端的黑名单机制更新也需要时间,有效期短相当于给每次泄露加了一个天然止损点。
90 天还有一个隐藏好处:强迫你建立自动化流程。如果你每 90 天手动换一次证书,你很快就会受不了,于是被迫去配置自动续期脚本。这一旦跑起来,你的运维体系其实比“一年买一次证书放着不管”更健康,因为你始终知道证书的真实状态,而不是等到浏览器报错那天才发现快过期了。
我自己经历过一次付费证书静默过期导致线上订单支付接口报错的事故,那次之后我对“手工续期”三个字PTSD了。Let‘s Encrypt 的短周期策略,实际上是把“怕过期”这种情绪从运维日常里彻底赶走了。
3. 工具选型与准备工作:两套主流方案怎么选
3.1 Certbot:最经典,生态好,适合绝大多数人
Certbot 是 EFF(电子前沿基金会)出品的官方客户端,也是 Let‘s Encrypt 社区里资历最老、教程最多的工具。它支持 Nginx、Apache 的全自动配置,一条命令就能完成“签发证书 + 改服务器配置 + 配置自动续期”三步。
它的优点很明显:生态成熟、文档全、自动化程度高。遇到问题顺手一搜,基本上全世界踩坑的记录都能找到。个人站长和中小团队服务器数量不算多的情况下,Certbot 是零基础入门最稳的选择。
它也有小缺点:相对比较重,会往系统里装一些 Python 依赖,虚拟环境用得多的人可能会觉得有点“污染系统”。另外它对 Nginx 自动修改配置这个行为,有时会覆盖你原本写好的自定义片段,这个在特定版本里出现过,需要注意。
3.2 acme.sh:轻量级,纯 Shell 脚本,适合跨平台和 DNS 厂商适配
acme.sh 是使用纯 Shell 实现的 ACME 客户端,最大的优势是几乎不依赖任何额外的运行环境,只要有 curl 和 cron 就能跑。而且它对国内各主流 DNS 厂商的 API 适配做得特别全,阿里云、腾讯云、Cloudflare、华为云都覆盖到了,写通配符证书的时候非常方便。
我最喜欢 acme.sh 的一点是它默认支持的安装模式很优雅:脚本会安装到 ~/.acme.sh 目录下,输出证书到独立目录,然后通过 cron 任务检查续期时间。你不需要改服务器软件的主配置文件,只在 Nginx 配置里指定证书路径即可,灵活性高很多。
3.3 准备工作:域名解析、服务器环境、端口放行
不管用哪套工具,准备工作的核心只有三件事:
第一,域名解析必须正确。你要签发的域名,A 记录必须已经指向你当前操作的服务器 IP,并且通过 dig 或 nslookup 能查到。很多人第一次签证书失败,十有八九是解析还没生效或写错了主机记录。
第二,防火墙和云安全组放行 80 和 443 端口。HTTP-01 验证需要 80 端口能访问 CA 的临时文件,证书续期成功后 HTTPS 访问需要 443 端口。我这几年排查过不少“签发成功但网站打不开”的 case,罪魁祸首基本都是安全组没放行 443。
第三,系统时间要正确。证书签发验证和后续的 HTTPS 握手依赖精确的时钟同步,时间偏差超过几分钟就会报错。建议所有服务器都配好 NTP 时间同步,这一步经常被忽略但又特别重要。
3.4 一张表对比:Certbot vs acme.sh
| 对比维度 | Certbot | acme.sh |
|---|---|---|
| 运行环境依赖 | Python 3、较多系统包 | 仅需 curl、cron,极轻量 |
| 支持操作系统 | Linux 全系、Windows 有限 | Linux、macOS、Windows 部分 |
| 自动配置 Web 服务器 | 支持,可自动改 Nginx/Apache | 不直接改,只产证书 |
| DNS-01 支持 | 插件不少但部分要收费 | 覆盖国内外 80+ DNS 厂商 |
| 通配符证书 | 支持(配合 DNS 插件) | 支持(配合 DNS API) |
| 定时续期方式 | systemd timer 或 cron | 默认 cron |
| 适合场景 | 新手入门、标准服务器 | 多域名、跨平台、国内云环境 |
下面我的实操演示以 Certbot 为主,因为它的操作路径更直观、适合所有人先跑通一遍逻辑。acme.sh 的具体玩法在后面关于 DNS-01 和通配符的问题章节里补充。
4. 实操:从零签发一张免费证书并自动续期
4.1 安装 Certbot 并签发第一张证书
环境说明:以 Ubuntu 22.04 LTS + Nginx 为例,不要一上来就想着图形化界面,命令行 15 分钟能干完的事没必要花时间找面板。
先更新系统包索引并安装 Certbot 和 Nginx 插件:
bash复制sudo apt update
sudo apt install -y certbot python3-certbot-nginx
安装完成后,直接执行签发命令:
bash复制sudo certbot --nginx -d example.com -d www.example.com
这一步 Certbot 会尝试自动修改 Nginx 配置,把 80 端口的请求跳转到 HTTPS,并填上证书路径。中间会问你两个问题:一是要填一个紧急联系邮箱(证书到期前 CA 会发提醒邮件);二是是否同意服务条款。按照提示确认即可。
如果签发顺利,你会看到类似下面的输出:
code复制Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/example.com/privkey.pem
看到这两行路径就意味着证书已经签发成功。这里有一个细节值得强调:/etc/letsencrypt/live/example.com/ 里的文件其实是符号链接,指向 archive 目录下带版本号的文件,方便你在续期后切换版本而不用改 Nginx 配置。这个设计很巧妙,续期后 Nginx 里配置的路径不需要动,因为符号链接会自动指向最新的那次签发结果。
4.2 设置自动续期:90 天一次的“定时闹钟”
默认情况下,Certbot 安装时会自动创建续期定时任务,但我们需要主动验证一下它是否真的在工作。
bash复制sudo certbot renew --dry-run
这个命令会模拟一次续期过程,不会真正申请新证书,但会检查所有配置是否正常。如果看到 Congratulations, all simulated renewals succeeded 字样,说明自动续期链路已通。之后系统里的 systemd timer 或 cron 任务会在证书到期前自动执行续期。
Certbot 的续期逻辑是:系统会每天检查一次,只有当证书离到期不足 30 天时才会真正发起续期请求,避免无意义的重复签发。
4.3 验证 HTTPS 是否真正生效
证书签发完成后,别急着收工,花两分钟做三个检查:
- 用浏览器直接访问
https://example.com,看地址栏是否出现小锁。 - 在命令行执行
curl -I https://example.com,确认返回的HTTP/2 200状态。 - 使用在线 SSL Labs 测试(或者本地
openssl s_client -connect example.com:443 -servername example.com)查看证书链是否完整。
这里面第三项很多人容易忽略。Let‘s Encrypt 签发的证书链里包含两个证书:站点证书和中间的 R3 证书。有些服务器在部署时只配了站点证书没配中间证书,浏览器就会报“证书链不完整”的错误。Certbot 生成的 fullchain.pem 已经把两条链都拼好了,所以直接用这个文件就能避免这个坑。
4.4 区域差异提醒:默认签发策略的“非预期慢”
Let‘s Encrypt 的全球基础设施覆盖很广,正常情况下单张证书签发时间在几秒以内。但如果你在特定网络环境(比如部分国内云服务器)里第一次签发,可能会遇到请求超时或验证文件拉取不到的情况。这时候不要慌,大概率是指向 Let’s Encrypt 服务器的网络链路有抖动,换个时间段重试,或者稍等一两分钟再执行一次命令,基本都能解决。我见过一些同学一失败就怀疑域名解析有问题,实际上解析完全正常,纯粹是网络抖动。
5. 落地场景拆解:阿里云服务器和群晖 NAS 的两个典型实战
5.1 场景一:阿里云服务器 + 网站证书免费替换付费证书
很多人在阿里云上买过域名和服务器,第一反应是直接在阿里云控制台申请免费版 DV 证书。阿里云确实提供每年 20 个免费证书额度,但有一个让人头疼的限制:免费证书的有效期只有 3 个月,而且需要手动申请、手动下载、手动部署到服务器上。每三个月重复一遍“创建证书 -> 下载 -> 上传到服务器 -> 改配置 -> 重启 Nginx”——这个流程很多人做两轮就觉得烦,第三轮开始就躺平了。
相比之下,Let’s Encrypt 免费证书配合自动续期,配置一次之后完全不用管。我在阿里云 ECS 上实测的完整方案如下:
第一步:确认安全组放行端口。 在阿里云控制台找到 ECS 实例对应的安全组,添加入方向规则,放行 TCP 80 和 443 端口,授权对象填 0.0.0.0/0。这个步骤不止影响 Let‘s Encrypt 签发,也影响你网站对外提供 HTTPS 服务。
第二步:解析验证域名指向。 用 ping example.com 或 dig +short example.com 确认域名解析到了这台 ECS 的公网 IP。如果域名是在阿里云解析(云解析 DNS),这一步通常早就完成了,但值得复查。
第三步:安装 Certbot 并签发。 按照上一节的操作执行即可,命令完全一致。
第四步:配置自动续期。 sudo certbot renew --dry-run 验证成功后,系统会自动创建相关定时任务。可以在 crontab 里再确认一下:
bash复制sudo crontab -l | grep certbot
如果输出里有类似 0 */12 * * * certbot renew --quiet 的内容,说明定时续期任务已经存在,无需额外操作。
整个过程下来,原来可能需要每年在控制台操作三四次的“手工证书采购+部署”,彻底退化成了一次性的配置代码。对个人站长来说,省下的不只是 99 或者 599 的证书费,还有每隔几个月都要花半小时去折腾证书的那些噪音。
这里顺手说一个阿里云控制台的坑:每次申请免费证书时,阿里云的流程会要求做一个“域名验证”操作,但验证状态经常有延迟。如果你同时管理多个域名,很容易出现“某个域名验证了三天还没通过,影响其他域名申请”的情况。用 Let’s Encrypt 之后,这类系统状态检查就彻底消失在了日常工作里,这个体验提升很难用钱衡量。
5.2 场景二:群晖 NAS 更换证书报错的处理实录
群晖 NAS 是很多人放在家里的“小数据中心”,DSM 系统里自带证书管理,但默认证书经常不受信任,你访问自家 NAS 的 HTTPS 页面时浏览器会大红色警告。很多人的需求是“把群晖的 SSL 证书换成免费的 Let‘s Encrypt 证书”。
先说说最常规的做法:在 DSM 控制面板的“安全性 -> 证书”里,直接点击“新增”,选择“从 Let’s Encrypt 获取证书”,填入域名、邮箱,提交即可。这个流程群晖官方已经做得比较顺畅,而且 DSM 会自动配置续期,基本不用手工干预。
但如果你的群晖没有公网 IP、只是局域网访问,或者域名没有解析到群晖所在网络的公网地址,那这个内置功能基本派不上用场。这种情况下,需要把通过其他方式(比如 acme.sh 或 Certbot)签发的证书手动导入到群晖里,替换系统证书。
这一步是热搜词里“群晖换了阿里云ssl证书显示‘抱歉,您所指定的页面不存在’”的典型来源。很多人在群晖控制台上传了阿里云下载的证书文件后,访问 https://NAS的IP:5001 提示页面不存在。原因大概率是上传的证书文件不匹配,或者导入的证书链不完整。
完整的操作逻辑如下:
- 先在本地把 ca_bundle.crt(中间证书)和 certificate.crt(站点证书)合并成完整的链文件:Linux 下
cat certificate.crt ca_bundle.crt > combined.crt。 - 在群晖“证书”页面点击“新增 -> 导入证书”,选择“私钥”为下载的 key 文件,选择“证书”为合并后的 combined.crt。
- 导入后一定把“证书”属性改为“默认证书 ”,否则 DSM 的登录页面还是用旧证书。
- 重启一下 DSM 管理页面所在的端口服务,或者无痕窗口重新访问确认证书生效。
这个报错的关键在于:群晖对证书链的完整性要求很严格,如果只导入单张证书而缺少中间证书,群晖内部的 Web 服务(nginx)会因为证书链不全而出现路由异常,表现出来就是“页面不存在”。只要你把证书链合并正确,这个问题基本不会出现。
如果你自己不想在本地搞这些命令行,也可以把 Let‘s Encrypt 证书分成证书、私钥、中间证书三个文件分别上传,但在绝大多数情况下,合并成单个链文件再导入是最不容易出错的路径。
5.3 场景三:多个域名 / 子域名一次性签完的与通配符方案
当你有 blog.example.com、shop.example.com、api.example.com 三个子域名时,有两种方案:
- 方案一:签发一张证书,包含这三个域名(SAN 证书)。Let‘s Encrypt 单张证书最多可包含 100 个域名。对三个子域名共用一个站点或一台服务器的情况,这个方案配置最省事。
- 方案二:给每个子域名各签一张证书。适合子域名分散在不同服务器上的场景,每台服务器只管自己的证书。
如果你需要给未来任意子域名都签发证书,那就得用通配符证书 *.example.com。通配符证书不支持 HTTP-01 验证,必须走 DNS-01。这意味着要拿到 DNS 服务商 API 的密钥,再配合 acme.sh 自动添加 TXT 记录完成验证。acme.sh 对阿里云 DNS 的适配特别友好,配置大致如下:
bash复制export Ali_Key="你的AccessKey ID"
export Ali_Secret="你的AccessKey Secret"
acme.sh --issue --dns dns_ali -d example.com -d "*.example.com"
签发完成后,acme.sh 会把证书输出到指定目录,你只需要在 Nginx 或群晖的配置里引用通配符证书路径。注意,这里的阿里云 AccessKey 建议使用 RAM 子账号并只授予 AliyunDNSFullAccess 权限,不要直接用主账号的密钥。主账号密钥泄露相当于把你整个云账号的控制权交给别人,这个风险完全不值得冒。
6. 常见问题与排查技巧:那些年我踩过的坑
6.1 证书签发失败?先别重跑,按顺序排查
签发失败是最常见的入门问题,报错信息翻来覆去就是那几类,直接对表查:
| 报错场景 | 常见原因 | 解决办法 |
|---|---|---|
Invalid response from http://... |
80 端口未放行或防火墙拦截 | 检查安全组/防火墙,确认 .well-known 路径可访问 |
DNS problem: NXDOMAIN |
域名解析未生效 | 用 dig 查看解析记录,确认 A 记录指到本机 |
Failed to connect to host for DV |
服务器无法访问 Let’s Encrypt 服务 | 换网络/时段重试,检查是 S 出口限制 |
Too many certificates already issued |
超过同一域名的签发数量限制 | 等待一周或检查是否重复签发了大量证书 |
Certbot 找不到 Nginx 配置文件 |
Nginx 安装路径或配置文件结构异常 | 改用 --webroot 方式,或手动指定配置文件路径 |
我再补充一个频繁踩坑的点:很多人的服务器上不止一个站点或不止一套 Web 服务。Nginx 占用 80 端口,Apache 也占用 80,或 Docker 里的容器又占了一个端口。这种情况下 HTTP-01 验证要定位到正确的 .well-known 路径就比较麻烦。最简单的方案是临时停掉其他占用 80 端口的服务,签完证书再把服务拉起来。但对生产环境来说这不可接受,所以更稳妥的方式是用 --webroot 模式,把验证文件放到能通过 HTTP 访问到路径下,顺带保证了验证过程不会影响其他服务。
6.2 续期失败:CERBOT 定时任务明明存在,却还是过期了
自动续期配置好之后,我见过不少人在第三个月后发现证书真的过期了,一查日志才发现定时任务从来没跑成功过。典型原因有:
- 系统时间漂移:定时任务按系统时间执行,如果服务器时间偏差过大,任务可能在错误的时间点执行。
- 服务重启后依赖的顺序问题:某些云环境里,certbot 续期任务依赖 Nginx 或网络就绪,重启后任务被跳过。
- 证书对应的域名变更:你改过 DNS、迁移过服务器,但 Certbot 配置里还是旧的域名,续期时验证失败。
排查办法很简单,就看日志:
bash复制sudo journalctl -u certbot.timer --since "30 days ago"
或者直接看 certbot 的续期日志文件,通常位于 /var/log/letsencrypt/。如果日志提示域名验证失败,回到上表排查网络和解析问题。如果日志提示 python 依赖异常,那基本是系统升级时某个包版本被更新导致 Certbot 与 Python 插件不兼容,重新安装/升级 certbot 即可。
这里给出一个经验之谈:续期日志要养成定期看的习惯,哪怕每月只看一次。因为证书过期这种事,浏览器端只会在到期前 30 天开始显示警告,但如果你从来不看浏览器控制台,等到全网大面积报错时,你的站已经失败了好几天了。主动检查比被动收到告警省太多事。
6.3 私钥泄露怎么办?吊销与重新签发是第一选择
Let‘s Encrypt 证书私钥泄露后的处置流程和商业证书一致:先用 certbot 吊销,再申请新证书替换。
bash复制sudo certbot revoke --cert-path /etc/letsencrypt/live/example.com/cert.pem
sudo certbot delete --cert-name example.com
sudo certbot --nginx -d example.com -d www.example.com
吊销之后,Let’s Encrypt 会把被吊销证书的信息推送到 OCSP 服务器和浏览器端的吊销列表,但它们真正“全网生效”有一定延迟。因此如果确认泄露,第一时间要做的还是先把服务器上配套的部署密钥全部轮换掉,否则光吊销证书没多大意义,攻击者也许早就拿到了私钥。
6.4 免费证书的局限与替代方案
Let‘s Encrypt 也不是万能的。如果你需要的是 OV(组织验证)或 EV(扩展验证)证书,也就是浏览器地址栏直接显示公司名字的绿色效果,这类证书 Let’s Encrypt 提供不了。银行、金融、大型企业官网这类对身份验证等级要求较高的场景,仍然建议采购商业证书。
还有一点:Let‘s Encrypt 证书有效期只有 90 天,如果你有一套非常传统、不允许安装任何额外软件、还必须手工部署证书的生产链路,那它可能并不适合你。这类环境更适合你继续用商业付费证书,或者考虑云厂商提供的免费单域名证书并做好日历提醒。
但如果你门下的服务器比较多、域名经常在变化、或者只是想给个人项目做到“浏览器不再大红叉警告”,Let’s Encrypt 绝对够用。它不一定是每个场景的万能药,但对绝大多数中小型 Web 服务来说,性价比是碾压级的。
7. 免费证书也能用得优雅:几个安全加固的思路
7.1 ECDSA vs RSA:管的域名多的人可以考虑换曲线
Let‘s Encrypt 默认签发的证书都是 RSA 2048 位。从 2023 年开始,Let’s Encrypt 也支持 ECDSA 的 P-256 证书。ECDSA 算法的优势是密钥更短、握手更快、对移动端更友好,尤其在高并发场景下服务端 CPU 消耗更低。
Certbot 命令行下可以通过 --key-type ecdsa 参数指定签发 ECDSA 证书:
bash复制sudo certbot --nginx -d example.com --key-type ecdsa --elliptic-curve secp256r1
提醒一句:ECDSA 证书虽然好,但在一些旧设备(Android 4.x 等)兼容性不如 RSA。如果你的用户设备基本是在 2016 年之后,可以直接上 ECDSA;如果客户群体比较杂,保守起见继续用 RSA 就行。我个人的做法是:CDN 入口用 RSA(兼容性兜底),源站内部用 ECDSA(性能优先),两者并行,互不影响。
7.2 OCSP Stapling:让小锁出现得更稳
OCSP(在线证书状态协议)用于查询一张证书当前是否有效。浏览器访问 HTTPS 站点时,默认可能要到 CA 的 OCSP 服务器查询状态,这个请求有时很慢,甚至部分地区 DNS 解析不到,导致浏览器显示不安全警告。
开启 OCSP Stapling 后,服务器会定期主动去 CA 拉取一次 OCSP 响应结果,并缓存起来,在与浏览器握手时直接返回。这样浏览器就省去了自己去 CA 查询的步骤,相当于“服务器帮你排队把事办好了”。
Nginx 里开启方式很简单,在 server 块中加:
nginx复制ssl_stapling on;
ssl_stapling_verify on;
在 Certbot 自动配置的 Nginx 配置上手动补这两行即可。我这边实测开启后,首次握手的整体时间缩短了约 20%,虽然幅度不大,但在弱网环境下感知非常明显。
7.3 别忽略证书监控:自动化再稳也扛不住配置漂移
我会建议每个运维人,不管配置了多完善的自动续期,都加一层证书监控。可以是简单的 cron 脚本写日志,也可以用现成的在线监控工具(比如 UptimeRobot 的 SSL 监控)。设置证书到期前 15 天发邮件或 Webhook 提醒。
为什么?因为自动续期只解决“证书到期了自动换新”这一个问题。如果你中途换了服务器、改了 Nginx 配置、重建了容器,续期任务可能被冲掉了或者证书路径变了,此时系统并不会主动告诉你。直到用户反馈“网站显示不安全”,你才发现证书默默过期了半个月。
对峙这种状态,最简单的做法是:
bash复制echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -enddate
每个月跑一次这个命令,输出里的 notAfter= 就是证书到期时间。盯着它,你就永远不可能被证书过期打个措手不及。
8. 我的实际体验与最后的几句建议
从 2017 年到现在,我管理过的服务器上跑过付费证书、云厂商免费证书、Let‘s Encrypt 证书,也手动配置过商业 CA 的提交审核。站在 2024 年回头看,Let’s Encrypt 几乎已经渗透进了整个互联网的基础设施。它给我最大的价值不是省掉了几千块钱,而是把“证书过期”这件事从我的运维操心事里彻底删掉了。
如果你正在犹豫要不要切换到 Let‘s Encrypt,我给你一个务实的建议:先拿一个非核心业务域名试跑一轮,走完“签发 -> 部署 -> 自动续期 -> 观察 90 天 -> 成功续期”全流程。这一步跑通之后,你会感受到那种“设好就忘”的安心感——证书就像水电费一样在后台自动循环运转,不需要你隔三差五想起来续费一次。
另外,不管最终选择 Let’s Encrypt、服务商的免费证书,还是继续付费商业证书,我建议大家都要把证书相关的密钥、CSR、吊销信息这些资产管理起来。证书是最容易被人忽略的“核心资产”,一旦过期或泄露,带来的影响可能比服务器宕机还严重。
如果你在配置过程中遇到什么新的问题,或者发现了更好的自动化方式,欢迎在评论区留言交流。我自己也一直在升级这套证书管理流程,比如最近在实验用 acme.sh 结合 DNS 厂商 API 管理多域名的通配符证书自动轮换,后续跑通了再写一篇完整的实战记录出来。
