小程序对证书的硬性约束
选证书之前先明确边界,免得签出来才发现不合规。微信小程序内核要求:证书必须由公共信任根签发;TLS版本至少达到某个安全标准,过低版本已被禁用;证书链必须完整,不能只放叶子证书而漏掉中间证书;证书里的域名必须与小程序后台配置的合法域名严格一致。
这里有一个容易忽略的点:通配符只覆盖一级子域名。一张通配符证书能保护接口子域名和图片子域名,但保护不了二级子域名。小程序如果按环境拆分子域名,开发环境、测试环境和正式环境都在一级子域名范围内,一张通配符全部覆盖;如果拆分到了二级子域名,就需要单独处理。
另一个边界是国内部署的域名备案。小程序后端域名如果解析到境内的服务器,域名必须完成备案,否则即使证书合法,网络层也会被挡住。证书本身不解决备案问题,但选型时要一起考虑进去。
免费证书的适用边界
免费域名验证证书的代表是Let's Encrypt,ZeroSSL作为补充存在。它们的共同特征是:只验证域名控制权、不验证企业身份、有效期短、通过自动化协议完成签发和续期。
对小程序来说,域名验证证书完全满足加密与信任要求——微信不强制看证书里的企业名称,只校验证书链和域名是否匹配。因此以下场景用免费证书是合理的选择:个人开发者或独立小程序,不涉及支付和实名敏感信息;企业内部工具类小程序,用户群封闭;产品原型验证阶段,快速上线试错;多子域名后端架构,用免费通配符一张覆盖。
不建议用免费证书的场景也有明确的边界:金融支付、医保政务、需要证书详情里展示公司名称来增强信任的电商主页。这些不是域名验证证书的加密强度不够,而是业务侧需要组织验证或扩展验证的身份背书,免费证书给不了。
验证方式的取舍
免费证书自动续期能不能稳定运行,一半取决于验证方式的选择。自动化协议提供两种主流验证方式:HTTP文件验证和DNS记录验证。
HTTP文件验证要求在域名根目录下放置一个验证文件,并且需要服务器的某个端口公网可达。它对单域名很友好,配置起来也比较顺手。但有两个硬伤:一是小程序后端如果放在内网、容器或CDN后面,端口不一定能透传出去;二是通配符证书不能用HTTP文件验证来签发,这是协议规范里写死的规则。
DNS记录验证则是通配符场景的唯一解法。证书机构给你一个令牌,你在域名的DNS解析中添加一条特定的TXT记录,证书机构去公网查到这条记录就验证通过。它不依赖Web服务、不挑端口、能证明你对整个域名区域的控制权,天然适配通配符证书。代价是你需要让自动化工具有权限修改DNS记录——要么用DNS服务商的API令牌,要么接受手动添加TXT记录,但手动模式没办法实现自动续期。
对小程序的场景来说,结论很直接:只要涉及通配符,或者后端不在公网端口直接暴露,就走DNS记录验证。
自动续期闭环的搭建
免费证书的短有效期是一把双刃剑:短周期逼迫你实现自动化,自动化做好了就再也不用管;自动化没做好,过期那天小程序的所有请求都会报错。
闭环搭建可以分为几步。第一步,在服务器上安装自动化客户端并注册账号,注册邮箱用于接收证书机构的安全通知,不要填虚假地址。第二步,将DNS服务商的API凭证配置到客户端环境中。关键原则只有一条:绝不用主账号的密钥,创建专用子账号或令牌,权限范围收敛到只允许修改TXT记录。第三步,执行签发命令,同时申请根域名和通配符域名,避免根域名没有被覆盖。客户端会自动添加TXT记录、等待传播、证书机构验证通过、删除TXT记录、将证书文件保存到指定路径。第四步,将证书安装到Web服务器实际读取的目录,并配置续期完成后的服务重载命令,这样每次续期后Web服务器会自动加载新证书。第五步,确认定时续期任务已经正确配置,每天执行一次检查,当证书剩余有效期接近临界值时自动触发续期。
续期链路里最脆弱的环节是DNS API令牌过期。很多续期静默失败的根本原因是令牌被轮换了但服务器上的环境变量没有同步更新。建议把令牌的有效期和最后更新时间记录下来,设置提前告警。
部署侧的配合
证书签出来只是前半段。小程序后端还要做两件事情。
第一件事是在微信公众平台后台的服务器域名配置中,把证书对应的域名加入合法域名列表。证书合法但域名没有配置,请求一样会被拦截。
第二件事是Web服务器要配置完整的证书链。很多开发者只配置了证书文件就以为完事,但某些客户端如果中间证书缓存不一致会报证书链不完整。配置完成后可以用命令行工具检查证书链是否完整,不要在浏览器里测就算了——浏览器会帮你自动补全证书链,真机小程序不会。
多环境隔离建议用子域名而不是多张证书来区分。开发环境、测试环境和正式环境同属一张通配符证书覆盖的范围,小程序后台按环境切换合法域名列表即可,避免证书台账膨胀。
常见踩坑
通配符漏加根域名是一个很常见的错误。签发了通配符证书但没有签发根域名,小程序如果配置根域名的请求就会报证书不匹配。
用HTTP文件验证去签通配符证书也行不通,协议直接报错,通配符只能用DNS记录验证。
DNS记录添加后传播需要时间,如果证书机构在记录还没有全球生效时就去查询,会查不到导致签发失败。客户端可以配置等待时间来缓解这个问题。
续期成功后Web服务器没有重载,或者重载时配置文件存在语法错误,会导致站点仍然使用旧证书,看起来像是续期没有生效。
DNS API使用了主账号的密钥,一旦泄露就等于别人可以任意修改你的域名解析记录,最小权限原则是底线。
只配置了叶子证书而没有配置中间证书,部分客户端会报证书不可信。
开发工具中开启了不校验域名选项调试通过后就以为线上也通,真机关闭调试后立刻报错,必须在真机环境下配合合法域名测试一次。
结语
小程序选择免费域名验证证书并实现自动续期,本质不是省那几百块钱的决策,而是把证书生命周期交给自动化闭环的工程取舍。只要小程序不涉及强企业身份展示,通配符证书配合DNS记录验证、自动化客户端、定时续期任务和服务重载钩子这条链路,能把每年操心一次证书变成配置一次后遗忘。真正需要盯的不是签发那一刻,而是续期链路里DNS令牌的有效性、重载钩子的正确性以及证书链在真机环境下的完整性。把这三条钉死,免费证书在小程序后端上和付费证书没有体验差距,只剩下短有效期背后那点自动化纪律。