你刚点开自己上线的小程序,页面一片空白,控制台报错 net::ERR_CERT_DATE_INVALID;用户反馈“点进去就卡住”“提示不安全”,而你还没买过云服务器——别急,这不是要你立刻下单,而是要你立刻判断:问题出在哪儿?要不要买?买什么?
我们和你一样,从零开始排查。下面是一份完全基于微信官方要求、浏览器安全策略与真实运维逻辑的可复现技术路径,不假设任何服务商、不承诺任何效果,只告诉你:每一步该查什么、怎么查、为什么必须这样查。
第一步:确认问题根源——SSL证书是否真的过期?
- 打开浏览器开发者工具(F12)→ Network 标签页 → 刷新小程序页面(或用 PC 端微信开发者工具模拟),观察所有 HTTPS 请求的响应状态;
- 找到任意一个第三方接口域名(如
api.yourdomain.com),右键 → Open in new tab,在新标签页中直接访问该地址; - 若浏览器显示“您的连接不是私密连接”“证书已过期”等提示,且地址栏左侧有红色叉号或“不安全”字样 → 确认 SSL 证书已失效;
- 在地址栏点击锁形图标 → “连接是安全的” → “证书有效” → 查看“有效期至”字段,对比当前时间(2025年12月30日);
- 若“有效期至”早于今日 → 证书已过期,必须更新;若晚于今日但仍报错,需检查证书链完整性或 TLS 版本兼容性(见第四步)。
第二步:判断是否必须购买云服务器?
SSL 证书本身不依赖云服务器,但部署证书需要可配置 HTTPS 的运行环境。是否需要购买,取决于你当前的托管方式:
| 你当前的托管方式 | 是否必须购买云服务器? | 关键判断依据 |
|---|---|---|
| 使用静态托管平台(如 GitHub Pages、Vercel、Netlify) | ❌ 否 | 平台自动托管 HTTPS,但不支持自定义域名 SSL 续期操作;若绑定的自定义域名证书过期,需确认平台是否自动轮换(如 Vercel 默认支持 Let’s Encrypt 自动续期) |
| 使用虚拟主机 / 共享主机(含面板如 cPanel) | ⚠️ 视配置而定 | 检查主机控制面板是否有 “SSL/TLS” 或 “Let’s Encrypt” 模块;若有且支持一键续期,无需购买新服务器;若模块灰显或提示“证书不可管理”,则当前环境不支持自主续期 |
| 使用已有的云服务器(如 ECS、CVM、轻量应用服务器) | ❌ 否 | 只需登录服务器,替换证书文件并重载 Web 服务(Nginx/Apache);不涉及新购行为 |
| 无任何服务器,后端接口托管在第三方 SaaS(如 Airtable、Supabase 免费层) | ✅ 是(仅当该 SaaS 不提供 HTTPS 自动续期) | 检查其文档是否声明“自定义域名 HTTPS 由用户自行配置”;若声明需用户上传 PEM 证书且无自动续期机制 → 你必须拥有可部署证书的服务器环境 |
第三步:若需部署新环境,最小可行方案是什么?
假设你确认必须拥有可自主管理 SSL 的服务器,以下是最小化、可验证的技术路径(非推荐配置,仅为排除购买必要性):
- 申请免费 DV 域名验证型证书:访问 Let’s Encrypt 官方推荐客户端
certbot或国内合规 ACME 客户端(如 acme.sh),执行:acme.sh --issue -d api.yourdomain.com --webroot /var/www/; - 验证域名所有权:自动在 Web 根目录生成验证文件,需确保该域名 A 记录已解析至当前服务器 IP;
- 安装证书到 Web 服务:执行
acme.sh --install-cert -d api.yourdomain.com --key-file /path/to/key.pem --fullchain-file /path/to/cert.pem; - 重载 Nginx 配置:修改
/etc/nginx/conf.d/yourdomain.conf,确保包含:ssl_certificate /path/to/cert.pem;ssl_certificate_key /path/to/key.pem;
然后运行nginx -t && systemctl reload nginx; - 设置自动续期(关键!):添加系统定时任务:
0 0 1 "/root/.acme.sh/acme.sh" --cron --home "/root/.acme.sh" > /dev/null。
第四步:微信小程序强制要求的 5 项 HTTPS 合规项(必须全部满足)
即使证书已更新,若以下任一条件不满足,小程序仍会拒绝请求:
- 域名已完成 ICP 备案(非 localhost、非 IP 地址、非未备案域名);
- 证书颁发域名与小程序 request 请求的域名完全一致(
api.example.com不能用example.com证书); - 证书链完整(使用
openssl s_client -connect api.yourdomain.com:443 -servername api.yourdomain.com检查输出中是否含Verify return code: 0 (ok)); - TLS 协议版本 ≥ 1.2(Nginx 配置中需含
ssl_protocols TLSv1.2 TLSv1.3;); - 证书由受信 CA 签发,且根证书已预置在微信客户端信任库中(不支持自签名、不支持私有 CA、不支持已吊销 CA)。
第五步:如何避免下次再“突然打不开”?
这不是靠记忆,而是靠机制。我们建议你立即执行以下三项可验证动作:
- 在日历中为证书设置双重提醒:首次提醒设在到期前 45 天,二次提醒设在到期前 15 天(微信小程序证书当前最长有效期为 1 年,无自动续期);
- 将证书有效期写入监控项:使用开源工具
ssl-cert-check或 Prometheus + Blackbox Exporter,对域名做周期性证书过期天数探测; - 在 CI/CD 流水线中加入证书有效性校验步骤:每次部署前执行
echo | openssl s_client -connect api.yourdomain.com:443 2>/dev/null | openssl x509 -noout -dates,解析notAfter字段并与当前时间比对。
常见问题解答(FAQ)
| 问题 | 解答 |
|---|---|
| 小程序打不开,只看到白屏,一定是 SSL 证书问题吗? | 不一定。需先排除:域名未备案、request 域名未在小程序后台配置、后端服务进程崩溃、CDN 缓存 502/504 错误。SSL 证书过期仅是其中一种可能,但它是唯一会导致浏览器/小程序客户端主动拦截并静默失败的前端可见原因。 |
| 证书过期后,重新购买并部署,小程序需要重新提交审核吗? | 不需要。SSL 证书属于服务器端配置,与小程序代码、版本、审核流程完全解耦。只要域名、接口逻辑、HTTPS 配置恢复合规,小程序即可立即恢复访问。 |
| 能不能用免费证书?会不会影响小程序上线? | 可以。Let’s Encrypt 等合规免费 DV 证书完全满足微信要求。但需注意:其默认有效期仅 90 天,且无自动通知机制;若未配置自动续期,极易因遗忘导致中断。商业证书通常提供 1 年有效期 + 到期邮件/SMS 提醒。 |
| 我只有域名,没服务器,有没有不买服务器也能续 SSL 的办法? | 有。部分域名注册商(如 DNSPod、阿里云域名)提供“免费 HTTPS 托管”服务,可为已解析至其 DNS 的域名自动申请并部署 Let’s Encrypt 证书;但需确认该服务是否支持你小程序所调用的具体子域名,且是否满足微信对 TLS 版本与证书链的全部要求。 |
| 证书更新后,用户手机上还是打不开,是不是缓存问题? | 不是。SSL 证书验证发生在 TCP/TLS 握手阶段,早于任何 HTTP 缓存生效时机。若更新后仍失败,大概率是:新证书未正确安装、证书链缺失、或服务器未重载配置。可使用 curl -I https://api.yourdomain.com 查看响应头是否含 200 OK,或使用 SSL Checker 工具(假设性示例)验证部署状态。 |