还在挑云服务器?小程序后端HTTPS没配好真不敢下单
很多刚准备搭小程序后端的朋友卡在同一个地方:云服务器买好了,域名也准备好了,但一想到HTTPS配置就犹豫——证书要钱吗?流程复杂吗?会不会耽误上线?
其实,只要选对证书类型、走对验证路径,免费SSL证书完全能支撑小程序合法域名要求。下面是一套经验证、可复现、不依赖备案、不依赖特定服务商后台的通用部署路径。
一、小程序对HTTPS证书的硬性技术要求(非政策性,纯协议层)
微信小程序官方文档明确要求:所有调用 wx.request 的域名必须启用 HTTPS,且服务端需满足以下三项基础协议能力:
- 证书必须由受信任的 CA 签发(免费 DV 类证书满足);
- 域名必须与证书中
Subject Alternative Name (SAN)完全匹配(支持通配符或精确二级域名); - 服务端 TLS 协议栈必须同时启用 TLS 1.0、1.1、1.2(仅支持 1.3 或仅 1.2 均可能触发小程序连接失败)。
二、免费证书申请全流程(以主流云平台通用逻辑为准)
以下步骤基于真实控制台交互逻辑整理,不绑定任何厂商名称,所有操作均可在主流云服务商 SSL 证书控制台复现:
- 登录云平台控制台,搜索“SSL证书”或“证书管理”,进入证书服务首页;
- 点击“申请免费证书”,进入申请向导;
- 填写待保护域名(如
api.example.com),注意:不能填写 IP、localhost、带端口的地址; - 选择验证方式:推荐 DNS 验证(无需停机、无需改服务器配置);
- 系统生成一条
TXT记录,格式为:_acme-challenge.api.example.com → xxxxxxxx; - 前往域名 DNS 解析后台,添加该 TXT 记录(主机名填
_acme-challenge.api,记录值粘贴完整); - 提交后等待 2–5 分钟,平台自动轮询验证,状态变为“已签发”即成功;
- 点击“下载”,获取四类文件:
1_root_bundle.crt、2_api.example.com.crt、3_api.example.com.key、certificate.pem(部分平台提供 Nginx/Apache/IIS 专用包)。
三、Nginx 服务器部署 HTTPS(实操命令级步骤)
假设你已安装 Nginx(1.18+),且后端服务监听在 http://127.0.0.1:8080:
- 上传证书文件至服务器(如
/etc/nginx/ssl/目录); - 确认私钥无密码(如含密码,用
openssl rsa -in 3_api.example.com.key -out 3_api.example.com.key.nopass去密); - 编辑站点配置:
sudo nano /etc/nginx/conf.d/api.example.com.conf; - 写入以下标准 HTTPS server 块(含 TLS 版本兼容):
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/nginx/ssl/2_api.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/3_api.example.com.key.nopass;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name api.example.com;
return 301 https://$host$request_uri;
}
- 检查语法:
sudo nginx -t,输出success后重载:sudo nginx -s reload; - 用浏览器访问
https://api.example.com,确认锁图标正常、无证书警告; - 用 curl 验证 TLS 版本支持:
curl -I --tlsv1.0 https://api.example.com、curl -I --tlsv1.1 https://api.example.com、curl -I --tlsv1.2 https://api.example.com,三者均应返回200或301。
四、免费版 vs 付费版证书能力对比(基于公开技术规范)
| 能力项 | 免费 DV 证书 | 付费 OV/EV 证书 |
|---|---|---|
| 域名验证方式 | DNS 或 HTTP 文件验证(自动化) | 需人工审核企业资质(3–5 个工作日) |
| 支持域名数量 | 单域名或主域名+1个子域名(如 api.example.com + www.example.com) | 支持 SAN 多域名(最多 100+)、通配符(.example.com) |
| 证书有效期 | 12 个月(到期前可重新申请) | 12–24 个月(部分支持自动续签) |
| 小程序兼容性 | 完全兼容(微信校验仅认 CA 信任链与域名匹配) | 完全兼容 |
| 客户端信任度 | 所有主流浏览器、微信、支付宝、iOS/Android 系统均预置信任 | 同左,无感知差异 |
五、小程序合法域名配置前必验三项
证书部署完成后,微信小程序后台添加域名前,请务必本地验证以下三项(避免因配置遗漏导致反复提交):
- 用手机微信打开
https://api.example.com,确认页面可访问且地址栏显示“安全”标识; - 用开发者工具“网络”面板抓包,确认
wx.request请求返回状态码为200,且响应头含Content-Type; - 在服务器执行:
openssl s_client -connect api.example.com:443 -tls1_2,输出中应含Protocol : TLSv1.2且无verify error。
常见问题 FAQ
| 问题 | 解答 |
|---|---|
| 免费证书能用在多个子域名上吗? | 单张免费证书通常支持 1 个主域名 + 1 个子域名(如 example.com 和 api.example.com)。如需更多,需分别申请或选用通配符证书(通常为付费)。 |
| 证书到期了怎么办? | 到期前 30 天可重新走一遍申请流程(DNS 记录无需变更),下载新证书替换即可,全程无需停机。 |
| 为什么小程序提示“不在合法域名列表”? | 请确认:① 域名已填入小程序后台“request 合法域名”;② 该域名解析 A 记录指向你的云服务器;③ 服务器 Nginx/Apache 已监听 443 端口并加载证书;④ 未使用 localhost、127.0.0.1 或带端口的地址。 |
| Windows Server 2008 R2 能部署吗? | 可以,但需手动启用 TLS 1.0/1.1/1.2(通过注册表修改 SCHANNEL 策略),Windows Server 2012 及以上默认支持。 |
| 证书申请后一直“待验证”怎么办? | 检查 DNS TXT 记录是否已全球生效(可用 dig -t txt _acme-challenge.api.example.com 验证);部分 DNS 提供商缓存较长,可等待 10 分钟再刷新控制台。 |