证书缩短到90天后,我用华为云DNS API彻底搞定了个人域名的全自动续期

举报
yd_243285056 发表于 2026/10/28 08:39:46 2026/10/28
【摘要】 做独立开发或者折腾自己的小站点,最烦人的琐事之一就是搞SSL证书。以前各大平台还能申请一年的免费证书,每年挑个周末上去点几下申请、下载、替换,倒也能忍受。后来主流证书有效期一缩再缩,很多免费单域名证书直接砍成了90天甚至更短。我手里挂着四五个子域名:个人博客、API接口、图床、还有一个偶尔测试用的后台。一想到每隔两三个月就得手动去申请、解析、下载、重载Nginx,简直让人抓狂。最开始我试过最...

做独立开发或者折腾自己的小站点,最烦人的琐事之一就是搞SSL证书。以前各大平台还能申请一年的免费证书,每年挑个周末上去点几下申请、下载、替换,倒也能忍受。后来主流证书有效期一缩再缩,很多免费单域名证书直接砍成了90天甚至更短。我手里挂着四五个子域名:个人博客、API接口、图床、还有一个偶尔测试用的后台。一想到每隔两三个月就得手动去申请、解析、下载、重载Nginx,简直让人抓狂。

最开始我试过最常见的Certbot走HTTP-01验证,但在实际用的时候经常恶心到自己:不仅80端口必须一直向公网敞开,每次新增或者调整Nginx的反向代理规则,还容易和ACME的验证路径发生冲突;更麻烦的是,HTTP验证根本没办法签发通配符泛域名证书(形如*.yourdomain.com)。

折腾了一圈,我决定彻底改走DNS-01验证路线,利用acme.sh脚本配合华为云的DNS API接口,把整个续期流程做成了静默自动化的黑盒。折腾完记录一下其中的细节和坑点。

第一件事是做好华为云子账号的权限隔离。
用DNS API验证签发证书,原理很简单:脚本通过调用云平台的接口,在你的域名解析里自动插入一条TXT记录,Let's Encrypt检测到这条记录证明你拥有该域名后,就会下发证书,脚本再通过API把这条临时TXT记录删掉。
既然要调接口,就必然要用到Access Key和Secret Key。很多新手为了图省事,直接拿华为云主账号的全局密钥丢在服务器上,这是极其危险的做法。云服务器长期暴露在公网,一旦被挂马或者被提权,主账号密钥泄露意味着你名下所有的云主机、数据库资产都面临风险。
安全的做法是进华为云IAM后台,单独建一个名为dns-cert-bot的子用户,权限绝对不要给全局管理员,而是只赋予DNS Administrator(云解析服务管理员权限),或者通过自定义策略只开放对应域名的RecordSet增删改查权限。即使最坏的情况下服务器被黑,攻击者也只能动动你的域名TXT记录,动不了你的服务器和账单。

第二件事是避开acme.sh内部目录的硬编码引用。
很多第一次用acme.sh的人,签发完证书后直接去~/.acme.sh/yourdomain.com/目录下,把里面的证书路径直接硬塞给Nginx的ssl_certificate配置。 官方文档其实反复强调过:~/.acme.sh/内部目录是脚本的内部工作区,其文件结构、命名在后续版本升级或者证书续订时随时可能改变。
正确的姿势必须使用acme.sh --install-cert命令,指定把生成的fullchain.cer和.key文件复制到系统规范的证书目录(比如/etc/nginx/ssl/),并且通过--reloadcmd参数绑上一句nginx -s reload。这样只有在证书真正成功续期并写到目标目录后,才会去平滑重载Nginx,避免因为续订中间过程出错直接导致Web服务挂掉。

第三件事是DNS记录生效的TTL延迟问题。
刚开始跑自动化脚本测试时,我遇到过几次卡在验证环节报错:脚本明明已经通过华为云API把TXT记录添加成功了,但Let's Encrypt的验证节点去查询时却提示找不到记录,最终签发超时失败。
查了下原因是国内各级DNS服务器有缓存和解析生效时间。默认情况下,如果解析的TTL时间较长,或者华为云这边的解析记录刚推送上去,外部权威DNS还没来得及同步,验证请求就已经发出去了。
解决办法是在调用acme.sh时,加上--dnssleep参数,显式要求脚本在添加完TXT记录后,强制等待60秒到120秒再通知CA服务器开始验证。多等这一两分钟,能让解析记录在各个公共DNS节点彻底传播开,验证成功率直接从八成提到了百分之百。

第四件事是泛域名证书带来的极简配置体验。
DNS验证最大的好处就是支持通配符(泛域名)。我一次性申请了一张同时包含yourdomain.com和*.yourdomain.com的双域名证书。
有了这张泛域名证书后,不管是主站,还是以后随手起的api.yourdomain.com、test.yourdomain.com,Nginx配置里全都可以统一引用这一套证书路径。以后只要服务器上临时加个二级域名做新项目测试,写完Nginx反向代理直接就能跑HTTPS,完全不需要再去为每个子域名单独走一遍申请流程。

配置完成后,acme.sh会在系统里自动植入一条crontab定时任务,每天夜里默默检测证书的剩余天数。只要发现证书还有不到30天过期,它就会在后台自动调华为云API加TXT、通过验证、拉取新证书、拷到指定目录、平滑重载Nginx,整套动作在两分钟之内完全静默完成。

这套方案已经在我的华为云服务器上跑了大半年,中途经历过两次自动续期,每次都是毫无感知地顺利更新完成。对于平时独立折腾站点的开发者来说,尽早把DNS API自动化接起来,用一张泛域名证书管住全站,以后就再也不用被各种证书过期告警邮件惊醒了。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。