尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Certbot自动化SSL证书部署指南:从Nginx到泛域名实战

Certbot自动化SSL证书部署指南:从Nginx到泛域名实战 SSL 证书这件事说简单也简单说麻烦是真麻烦。我从前做网站运维的时候经常要帮客户申请证书、手动续期、导入服务器一个域名一套流程走完至少二十分钟域名一多就成体力活。后来全面切到 certbot 之后签发、部署、续期基本上能做到自动化一台机器上几十个域名也不用担心证书到期漏掉。这篇把我在生产环境里用 certbot 安装 SSL 证书的完整思路写出来除了最常用的 nginx 插件一键签发也会覆盖泛域名 DNS 验证、自动续期、证书文件选择以及我在 Windows、Nacos 中间件、弱哈希算法告警这些场景里踩过的坑。下面讲的东西都是我实际操作验证过的适合刚接触 HTTPS 配置的运维和全栈开发也适合想把手动续期彻底丢给机器的老手。1. 为什么我最终选了 certbot 这套方案1.1 免费证书的三种常见渠道为什么 certbot 更省心我最早用的是商业证书一年几百到几千不等好处是兼容性好缺点是贵而且很多商业证书续费时还要重新走验证流程。后来国内云厂商也推免费 SSL 证书像阿里云每年可以领免费的 DV 证书在控制台申请、下载、上传服务器用起来确实省了一笔钱但续期还是偏手工。每三个月或每一年要去控制台点一遍域名多的时候容易漏而且不同云厂商的证书格式、上传流程还不一样。换一台服务器或者换一家云这套经验就得重来。certbot 完全绕开了这些重复劳动。它是 EFF 维护的开源 ACME 客户端装到服务器上之后签发、部署、续期一条流水线走完。收费证书的主打优势是 OV/EV 可信度但个人站、企业官网、绝大多数 API 服务用 DV 证书在浏览器和小程序端表现完全一样。所以我现在默认方案很固定只要能自动化一律 certbot Lets Encrypt只有客户明确要求 OV/EV 或内部系统不便联网时才回到商业证书或自签名。1.2 certbot 背后靠的是 ACME 协议验证原理并不复杂ACME 听上去高大上本质就是客户端和一个证书颁发机构CA之间的标准对话流程。你向 CA 申请证书时CA 需要先证明你确实拥有要申请的那个域名certbot 会帮你完成这一步。官方支持的验证方式有三种我整理成一张表放在下面。验证方式原理适合场景HTTP-01在目标域名 80 端口放临时文件CA 来访问验证站点已运行、80 端口可达DNS-01在域名 DNS 的 TXT 记录里放随机值CA 查询验证泛域名证书、80 端口不通TLS-ALPN-01在 443 端口用 ALPN 协议回显临时证书443 端口可达且支持 ALPN拿生活里的事打比方HTTP-01 像快递员到你楼下在你家门口的信箱里找到他事先放下的验证码信件DNS-01 像快递员直接去你登记在物业上的门牌信息里核对你是不是业主TLS-ALPN-01 介于两者之间需要在你家 443 门口的对话窗口里对上暗号。三种方式最终都是为了证明“这个域名的控制权在你手上”签出来的证书效力一样。你可能会问为什么 Lets Encrypt 证书只有 90 天这不是故意折腾你。证书有效期越短万一私钥泄露或者签发体系出问题影响面越小。短有效期配合自动化续期运维成本反而低于一年期证书。certbot 存在的意义就是把短有效期变成无感操作所以谁要是装完 certbot 之后忘了配续期那就等于没装。2. 安装前的环境梳理和工具选型2.1 先确认你的服务器具备哪些条件证书签发对服务器本身的要求不高但你要先确认它具备三个条件能装软件的自由、80/443 端口的控制权、域名 DNS 的管理权限。我用 Debian/Ubuntu 系最多CentOS/RHEL 换 dnf/yum 安装思路一样。Windows 环境也不是不行后面第 5 章会单独说但常规部署还是建议 Linux。我习惯先跑一遍检查命令再动手nginx -v看 Nginx 是否安装ss -tlnp | grep -E :80|:443看端口占用getent hosts example.com看域名是否已经解析到这台机器。特别是 HTTP-01 验证方式下CA 服务器要从公网访问你 80 端口如果云服务器的安全组没放行或者本机防火墙把 80 挡了证书签发十有八九会失败。别小看这一步我先踩过太多次“明明 Nginx 在跑外网就是 curl 不通”的问题。2.2 certbot 插件机制nginx 插件比手动改配置快在哪certbot 的核心优势不是单条命令而是它有一套插件体系。--nginx插件自动操作 Nginx 配置--webroot只放置校验文件到站点目录--standalone临时占用端口--manual手动交互适合泛域名 DNS-01。用表格对比会更清楚。插件/模式验证方式适合场景缺点--nginxHTTP-01已经用 Nginx 提供站点会改 Nginx 配置非标配置可能报错--webrootHTTP-01网站已在跑不想让 certbot 动配置必须确保校验路径可被外部访问--standaloneHTTP-01/TLS-ALPN-01服务器上没有 Web 服务或给中间件签发验证期间要占用 80/443 端口--manualDNS-01泛域名证书、80 端口不通交互式操作不配钩子无法无人值守对绝大多数人我推荐--nginx或--webroot。--nginx最省事证书签完它顺手把 ssl_certificate 这些指令写进 server 块还会问你要不要加 HTTP 到 HTTPS 的跳转。如果你的 Nginx 配置是多家共用、负载均衡复杂、或者用了非标准 include 写法--nginx插件自动改配置容易插错位置这时就退一步用--webroot它只管放校验文件签发后自己手动改 Nginx更可控。2.3 Debian/Ubuntu 安装的两种方式我的建议apt 安装最简单sudo apt update sudo apt install certbot python3-certbot-nginx。Debian 12 和 Ubuntu 22.04 自带的 certbot 版本做常规单域名、多域名证书完全够用装完系统还会自动挂上续期的 timer。缺点就是版本比官方仓库慢某些新功能比如新出的 DNS 插件接口、链优化要等系统更新才有。如果追求最新版本用 snapsudo snap install --classic certbot。这是 EFF 官方推荐的安装方式版本更新快但前提是系统装了 snapd某些云镜像可能没有。用 snap 装的 certbot 命令可能不在/usr/bincron 或 systemd 任务里如果写死/usr/bin/certbot就会找不到命令这个我在后面续期翻车里会再提一句。我的选择很务实干净的 Debian/Ubuntu 直接用 apt图省心要玩泛域名 DNS 插件、或者遇到 apt 版本不支持的参数时再用 snap 或 pip 装独立环境。判断版本很简单装完跑certbot --version建议至少 1.10 以上。3. 实操从签发证书到 nginx 接入全流程跑通3.1 单域名/多域名证书用 nginx 插件一键签发先准备一个最简单的 Nginx server 块确保站点能通过 80 端口访问。以 example.com 为例在 /etc/nginx/sites-available/example.com 里写上server { listen 80; server_name example.com www.example.com; root /var/www/example; index index.html; }然后执行命令sudo certbot --nginx \ -d example.com -d www.example.com \ --email youexample.com --agree-tos --no-eff-email-d可以写多个多域名会放进同一张证书的 SAN 列表里浏览器访问任何一个域名都信任。--email用于过期/续期提醒--agree-tos表示接受 ACME 服务条款--no-eff-email是拒绝接收 EFF 的营销邮件。第一次跑的时候certbot 会问你要不要把 HTTP 访问自动跳转到 HTTPS我一般选 2也可以直接加--redirect参数免交互。跑完看输出Successful 之后别急着开心执行sudo certbot certificates确认证书列表和到期时间。再打开 Nginx 配置文件你会看到 certbot 已经帮你加了listen 443 ssl;、ssl_certificate ...、ssl_certificate_key ...还生成了一段把 80 端口请求 301 到 HTTPS 的 server 块。这时候nginx -t systemctl reload nginx验证一下配置语法和重载站点 HTTPS 就能访问了。3.2 泛域名证书DNS-01 手动验证怎么操作如果站点有多个二级域名比如 a.example.com、b.example.com、c.example.com与其每张证书都去签一遍不如直接签一张*.example.com的泛域名证书。泛域名不能用 HTTP-01必须走 DNS-01因为 HTTP-01 要求每台机器都被验证。命令是这样的sudo certbot certonly \ --manual --preferred-challenges dns-01 \ -d *.example.com -d example.com \ --email youexample.com --agree-tos --no-eff-email注意我用的是certonly只签发证书不安装。certbot 会停在那里让你去 DNS 控制台添加一条 TXT 记录主机记录_acme-challenge记录值是一串由 certbot 生成的随机 token。添加之后不要急着回车先在另一台机器上确认记录已经生效dig short TXT _acme-challenge.example.com 8.8.8.8看到输出的值和你添加的一致再回到终端回车。整个验证过程在确认记录生效前不要临时加多条同名 TXT 记录否则权威 DNS 返回多条值时可能验证失败。如果你的 DNS 是阿里云这类有 API 的托管服务可以更偷懒。以阿里云为例网上有第三方的 certbot-dns-aliyun 插件先用 pip 装好再把 AccessKey 写在配置文件里dns_aliyun_access_key LTAI5t... dns_aliyun_access_key_secret xxxxxsudo chmod 600 /etc/letsencrypt/aliyun.ini sudo certbot certonly \ -a dns-aliyun \ --dns-aliyun-credentials /etc/letsencrypt/aliyun.ini \ -d *.example.com -d example.com插件会自动调 DNS API 添加/删除 TXT 记录签发过程不用人盯。不过这是第三方插件不是 certbot 官方出品使用前自己评估仓库活跃度和维护情况AccessKey 建议用只有 DNS 解析权限的子账号别拿主账号密钥直接写在服务器上。3.3 签发后证书长什么样怎么确认没拿错文件证书签出来后默认存放在/etc/letsencrypt/live/证书名/目录下证书名就是你第一个-d参数去点号后的主机名。目录里有四个关键文件cert.pem服务器证书本体只有叶子证书chain.pem中间证书链fullchain.pemcert.pem chain.pem 合并后的完整证书链Nginx 的ssl_certificate用它privkey.pem私钥权限默认 600务必保留在服务器绝不外传很多人会把 cert.pem 直接配进 Nginx结果浏览器提示证书链不完整就是因为缺中间证书。Nginx 里一律用 fullchain.pem这是最容易踩的坑之一。检查证书信息用 openssl 一把梭openssl x509 -in fullchain.pem -noout -subject -issuer -dates -ext subjectAltNamesubject看域名issuer看发证机构dates看有效期subjectAltName看 SAN 列表多域名和泛域名都在这里体现。再确认签名算法openssl x509 -in fullchain.pem -noout -text | grep -A2 Signature Algorithm正常应显示sha256WithRSAEncryption或ecdsa-with-SHA256。如果你看到sha1WithRSAEncryption别怀疑这就是后面要讲的弱哈希算法问题赶紧换证书。3.4 nginx 接入完整配置一段能直接抄的 server 块下面这段是我生产中常用的 HTTPS server 配置默认走 TLS 1.2/1.3打开 HTTP/2屏蔽掉一批老旧的加密套件。你有特殊兼容需求比如老 IE 客户端再自己调整server { listen 443 ssl; http2 on; server_name example.com www.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; 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; ssl_prefer_server_ciphers on; root /var/www/example; index index.html; } server { listen 80; server_name example.com www.example.com; return 301 https://$host$request_uri; }注意http2 on;是新版 Nginx 的写法。Nginx 1.25.1 之前HTTP/2 需要写成listen 443 ssl http2;1.25.1 之后建议改成listen 443 ssl;配合http2 on;。如果你用的是发行版自带的旧 Nginx又不确定版本跑一下nginx -V看编译参数有些发行版虽然版本低但也编译了 http2 模块写作listen 443 ssl http2;即可。没加 HSTS是因为 HSTS 一旦下发浏览器会在有效期内在任何情况下都强制走 HTTPS。我一般是确认自动续期跑通、证书稳定之后再加这行add_header Strict-Transport-Security max-age31536000; includeSubDomains always;加了之后如果哪天证书断了用户浏览器会直接打不开站点而不是看到警告页。所以 HSTS 属于“后期再开”的加固项别在第一次配 HTTPS 时就急着加。4. 自动续期这一步不做前面全白干4.1 90 天有效期背后的逻辑以及续期机制certbot 在 Debian/Ubuntu 系统上装好后默认会带一个 systemd timer 或者 cron 任务一天检查两次证书。certbot 自己会在证书剩余有效期不足 30 天时发起续期其他时候只是安静地看一眼不会有任何多余动作。你可以用这两条命令确认定时任务存在systemctl list-timers | grep certbot cat /etc/cron.d/certbotcron 文件一般长这样0 */12 * * * root test -x /usr/bin/certbot perl -e sleep int(rand(43200)) certbot -q renew。systemd timer 则自带随机延迟目的是避免所有服务器在同一时刻打爆 ACME 端点。总之不管哪种实现最终执行的命令核心就一句certbot renew。它会对所有即将过期的证书统一走续期流程不用一张张手动签。这里又要强调一遍90 天有效期不是坑是设计。真正会坑你的是那些“想着一劳永逸”的人签完证书就删掉定时任务三个月后站点突然打不开浏览器一片飘红。所以我会把续期这件事和签发证书放在同等重要的位置甚至更重要签一次证书只要几分钟漏一次续期造成的业务中断恢复起来可能要几个小时。4.2 reload 钩子证书更新了nginx 立刻用上用--nginx插件签发的证书续期时 certbot 会自动重载 Nginx如果你用的是certonly只签发证书的方式续期后证书文件在磁盘上更新了但 Nginx 进程还挂着旧证书文件的内存映射不会自动加载新文件。这时候必须加一个 deploy hook告诉 certbot 在续期成功后执行对应命令。最直接的做法是手动执行续期时带钩子sudo certbot renew --dry-run sudo certbot renew --deploy-hook systemctl reload nginx但手动执行不能替代定时任务里的行为。要长期生效把 deploy hook 写进证书的 renewal 配置编辑/etc/letsencrypt/renewal/example.com.conf在[renewalparams]段里加一行deploy_hook systemctl reload nginx或者建一个/etc/letsencrypt/cli.ini写上deploy-hook systemctl reload nginx这样所有证书续期后都会触发 reload。两种方式选一种别同时配两份导致重复执行。测试续期流程用sudo certbot renew --dry-run。dry-run 会连接 ACME 的预演服务器完整走一遍验证、签发预演、清理的流程但不会动你现有的证书文件。看到Congratulations, all simulated renewals succeeded就说明定时续期链路是通的。建议每周末或者每次改完 DNS 配置后手动跑一次 dry-run 养习惯。4.3 实操中发现的续期翻车现场第一类翻车是手动 DNS-01 签的泛域名证书到点续期时 certbot 没法自动加 TXT 记录。当初你用手工 copy-paste 的方式签的证书renewal 配置里依然记录着--manual模式定时任务跑续期时它会停下来等你输 token但没有人输于是续期失败。解决办法有两个要么把 DNS 换成支持 API 的托管平台用 DNS 插件要么给 certbot 配上 manual auth hook / cleanup hook让它自己调 API 完成 TXT 记录的增删。第二类翻车是用 snap 装的 certbot定时任务里 PATH 对不上。使用sudo snap install --classic certbot装出来的二进制在/snap/bin/certbot系统 cron 默认的 PATH 可能包含/usr/bin但没包含/snap/bin于是定时续期一直静默失败。排查时看/var/log/letsencrypt/letsencrypt.log发现根本没有续期动作但手动执行/usr/bin/certbot renew又提示找不到命令。处理方式是把 cron 或 deploy hook 里写全绝对路径/snap/bin/certbot或者干脆在 crontab 第一行设置 PATH。第三类翻车来自 Lets Encrypt 的速率限制。同一精确域名组合每周最多签 5 张重复证书同一注册域名每周最多 50 张新证书。如果你在调试时反复用同一组-d参数签发很可能会在某个瞬间收到429 Too Many Requests。遇到这个报错不要硬试等自然窗口过去再看。为了避免误伤调试阶段优先用--staging参数连预演环境预演环境有自己的速率限制不会污染生产额度。5. 常见问题与排查技巧实录5.1 问题速查从报错现象直接定位答案先说结论证书相关的报错九成都能从下面这张表里找到答案。我按自己真实遇到的频率排了序先看现象再对原因再去对应小节看细节操作。现象大概率原因解决办法HTTP-01 验证时报Failed to connect to 80服务器 80 端口未监听或防火墙/安全组未放行确认ss -tlnp云平台安全组放行 80验证时报Invalid response from http://...webroot 路径配错或 Nginx 对校验路径做了重定向核对 webroot临时放行.well-known路径浏览器报NET::ERR_CERT_AUTHORITY_INVALID没配 fullchain.pem只配了 cert.pemssl_certificate改成 fullchain.pem浏览器报NET::ERR_CERT_COMMON_NAME_INVALID访问域名不在证书 SAN 列表里用 SNI/别名访问匹配域名或重签加-d域名Windows/扫描工具提示弱哈希算法证书链里存在 SHA-1 签名的旧证书按 5.3 节检查并替换 SHA-256 证书链续期后 Nginx 还是旧证书certonly 签发方式没配 deploy hook在 renewal 配置里加 deploy_hook reload定时任务一直不续期certbot 命令路径不对或 timer 被停用查看 log检查 cron/systemd 服务状态表格是速查接下来几个小节是我觉得值得单独展开的场景。每个后面都附了具体命令照着敲就能定位。5.2 证书签发成功但浏览器仍报错时的排查顺序证书本身签下来了但浏览器就是不认这情况很让人崩溃。我的排查顺序从来都是固定的先看文件路径再看 nginx 语法然后抓包看实际返回的证书链。第一步确认 nginx 配置里ssl_certificate指向/etc/letsencrypt/live/example.com/fullchain.pem不是 cert.pem。第二步nginx -t检查语法之后systemctl reload nginx。第三步从外部直接看证书链openssl s_client -connect example.com:443 -servername example.com -showcerts /dev/null 2/dev/null | openssl x509 -noout -subject -issuer正常输出里issuer 和 subject 应该符合域名对应关系。如果出现verify error或输出的证书和服务器上 fullchain.pem 不一致那就是有反向代理、负载均衡或者 CDN 在前面换了证书。还有一个容易被忽略的坑如果站点前有一层负载均衡或 CDN你在源站上配好的证书可能没生效用户连接的是边缘节点边缘节点用的是自己的证书或旧证书。这种场景下应该在负载均衡/CDN 控制台上传证书而不是只在源站上折腾。对 API 服务尤其要小心很多公司只在网关层验证源站 Nginx 的证书根本不参与公网链路。5.3 弱哈希算法告警的完整处理流程热搜里有“win 下 ssl 证书使用了弱 hash 算法 CVE-2005-4900”这个我实际处理过。首次遇到的时候客户 Windows 服务器上做安全扫描报告是说证书使用了 SHA-1 或其他弱哈希签名要求安装补丁。我第一次也差点被带偏去找什么补丁名称后来想明白了这个告警的直接对象是证书的签名算法不是 Windows 系统漏洞光装补丁没用必须把证书链换成 SHA-256 签名的证书。先用一条命令判断当前证书是不是罪魁祸首openssl x509 -in fullchain.pem -noout -text | grep -A2 Signature Algorithm如果显示sha1WithRSAEncryption处理顺序是1确认叶子证书是由 certbot 或正规 CA 签发的certbot 默认用 SHA-256所以多半问题在中间证书链也就是你用了 cert.pem 而不是 fullchain.pem2把 nginx 配置改成 fullchain.pem3如果证书是从别的工具申请来的重新生成 CSR 时显式指定 SHA-256openssl req -new -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr \ -sha256 -subj /CNexample.com在 Windows 服务器上如果证书是通过 IIS 或其他工具导入的检查证书链是否包含完好的中间证书。Windows 证书管理器里的“证书链”标签可以直观看到是否有 SHA-1 签名节点。若是内网服务有自签名证书别偷懒用默认的 SHA-1生成自签名也带上 SHA-256openssl req -x509 -newkey rsa:2048 -nodes -days 825 -keyout server.key -out server.crt -sha256最后强调不要在网上搜 CVE-2005-4900 的补丁名往服务器上打。那是扫描工具对证书本身的提示正规修复是把弱签名的旧证书下线替换不是给操作系统打补丁。你的证书链只要全部变成 SHA-256 签名同样的扫描再跑一遍告警自然消失。5.4 中间件和 Windows 场景的证书部署经验内网中间件像 Nacos、Consul 这类要配 HTTPS第一反应别是申请内网 IP 证书。Lets Encrypt 对纯私有 IP 不签发证书192.168.x.x、10.x.x.x 这些地址做不了公网验证硬去申请基本失败。我自己常用的做法是给内网服务起一个域名比如 nacos.internal.example.com在公网 DNS 上先把这个域名指向任意一个公网 IP甚至不需要真实可达通过 DNS-01 验证先把证书签下来然后让内网 DNS 或各服务器 hosts 把 nacos.internal.example.com 解析到内网私有 IP。DNS-01 验证只看 TXT 记录不看 A 记录指向哪里所以这套路完全可行。证书文件拿到后Nacos 这类基于 Java 的中间件需要把 PEM 转成 PKCS12openssl pkcs12 -export \ -inkey /etc/letsencrypt/live/nacos.internal.example.com/privkey.pem \ -in /etc/letsencrypt/live/nacos.internal.example.com/fullchain.pem \ -out nacos.p12 -name nacos然后在 Nacos 配置里指定 keystore 类型和密码。不同版本配置项名称有差异常见的是server.ssl.key-store、server.ssl.key-store-password、server.ssl.key-store-typePKCS12这组具体以官方文档为准。要点是别直接把 PEM 文件路径填给 JVM 组件先转 PKCS12/JKS 再引用减少格式兼容性问题。Windows 上跑 certbot 有两种常见姿势一是用 WSL 在 Linux 环境里执行 certbot签发后用 openssl 导出 pfx再导入 IIS 或 Windows 证书库二是直接用 certbot 官方 Windows 版本但官方版本对 IIS 的自动化支持不如 Linux 插件推荐搭配 win-acme 这类工具处理 IIS 场景。导出 pfx 的命令openssl pkcs12 -export -out example.pfx -inkey privkey.pem -in fullchain.pem生成的 pfx 可以在 Windows 里双击导入导入到“个人”证书存储后再在 IIS 站点绑定里选择该证书整条链路就通了。另外还有人在 VMware vSphere 8 里碰到证书问题。这类虚拟化平台自身有一套证书体系不要直接在 vCenter 操作系统里装 certbot 去签平台证书。正确做法是先用 certbot 签发适合平台域名的证书注意 SAN 覆盖 vCenter 所有访问别名再把证书和私钥通过平台自带的证书管理工具导入。vSphere 7/8 对证书规格有严格检查私钥格式、密码、SHA-256 签名都会校验不满足直接拒绝导入。5.5 续期静默失败的排查清单定时续期是在后台跑的失败时不会弹窗报警所以你要主动检查。我自己总结了一套三分钟清单第一步看证书剩余天数sudo certbot certificates如果发现快要过期但没续说明续期链路断了。第二步看系统时间服务器时间偏差超过五分钟ACME 请求会因为时间校验失败而报错用timedatectl或ntpdate校正。第三步看日志/var/log/letsencrypt/letsencrypt.log会写明失败原因绝大多数情况是 DNS 插件凭证失效、网络不通、或者 Nginx 配置语法错误。再加两个容易被忽略的小细节证书私钥文件权限如果被改动比如目录变成 644 或者 owner 变成别的用户certbot 续期时会因为无法安全写私钥而中止同一台机器上如果手动跑 certbot 和定时任务同一秒触发会撞锁报错好在 certbot 自己会用锁文件串行化遇到 “Another instance of Certbot is already running” 别慌等一会再查即可。对于生产环境的证书我最终的建议是加一层外部监控别只依赖本地定时任务。可以用你熟悉的监控系统每 12 小时对证书到期时间做一个告警规则或者用脚本定期执行openssl s_client -connect example.com:443 -servername example.com /dev/null 2/dev/null | openssl x509 -noout -enddate去抓实际服务端的过期时间。证书是否真的在生效、用户访问到的证书是否新鲜探活比看本地文件更靠谱。我在实际项目中最后保留的一个习惯每次给新站点部署 HTTPS都会顺手在手机日历里设一个“三个月后再次 dry-run”的提醒。听起来有点傻但正是这个提醒让我逮住过两次因为 DNS 插件凭证过期没续上的情况。certbot 能帮你省掉九成的手工活剩下那一成依然得靠你保持对证书状态的敏感。如果你是第一次配别一上来就追求最复杂的泛域名、DNS API 自动续期。先从一张单域名证书开始跑通 HTTP-01 验证、让 nginx 正常走 HTTPS、再配合 deploy hook 把续期自动化这套地基打牢之后泛域名和中间件场景都会顺畅很多。
返回列表