微信小程序配置合法域名后,接口仍无法访问的解决办法(SSL证书链问题)
问题背景
- 在微信小程序开发过程中,为了避免免费SSL证书每3个月手动续期的麻烦,我们配置了证书自动续期功能。
- 然而配置完成后发现,尽管微信小程序后台已经正确配置了合法域名,但小程序却无法正常请求API接口。
- 搜索了一遍,发现可以用这个网站:https://myssl.com/ ,来查看我们的网址是否安全还存在哪些漏洞。
- 也就让我们发现了们证书链不完全,然后呢导致了微信小程序,即便是配置了合法域名,仍请求失败。级别为B级,要A级,小程序才能够调用你的接口。
- 插句题外话我们自动续期SSL证书使用的是 win-acme 这个工具,因为用的是windows server 2022的服务器。
- 然后win-acme配置弄完了他会创建下面的四个证书文件,一开始使用-crt文件以为没问题,结果应该用-chain才对。
问题现象
- ✅ 微信小程序后台域名配置正确
- ✅ SSL证书本身有效且在有效期内
- ❌ 小程序无法调用API接口
- ❌ 浏览器提示"不安全连接"
问题分析
经过排查发现,问题出现在 SSL证书链不完整 上。
免费证书的特点
- 有效期短:通常只有3个月
- 需要频繁续期:手动续期工作量大
- 证书文件结构:通常提供多个文件
自动续期后的问题
使用自动续期工具后,生成的证书文件可能只包含:
domain-crt.pem- 服务器证书(域名证书)domain-key.pem- 私钥文件
但缺少了完整的证书链文件,导致客户端(包括微信小程序)无法验证证书的完整信任链。
证书文件说明
典型的SSL证书包含以下文件:
your-domain.com-crt.pem # 服务器证书(域名证书)
your-domain.com-key.pem # 私钥文件
your-domain.com-chain.pem # 完整证书链
your-domain.com-chain-only.pem # 仅中间证书
解决方案
方案一:创建完整证书链文件
在服务器上执行:
# 进入证书目录
cd /path/to/cert/
# 创建完整证书链(将域名证书和中间证书合并)
cat your-domain.com-crt.pem your-domain.com-chain-only.pem > your-domain.com-fullchain.pem
方案二:直接使用现有证书链
如果证书提供商已经提供了 *-chain.pem 文件,可以直接使用。
Nginx配置修改
修改前(错误配置):
# API 服务
server {
listen 443 ssl;
server_name api.yourdomain.com;
# 只配置了域名证书,缺少证书链
ssl_certificate cert/api.yourdomain.com-crt.pem;
ssl_certificate_key cert/api.yourdomain.com-key.pem;
# ...其他配置
}
修改后(正确配置):
# API 服务
server {
listen 443 ssl;
server_name api.yourdomain.com;
# 使用完整证书链
ssl_certificate cert/api.yourdomain.com-chain.pem;
ssl_certificate_key cert/api.yourdomain.com-key.pem;
# ...其他配置
}
验证步骤
1. 测试Nginx配置
# Windows
nginx -t
# Linux
sudo nginx -t
2. 重启Nginx服务
# Windows
taskkill /f /im nginx.exe
nginx
# Linux
sudo nginx -s reload
3. 验证证书链
# 检查证书链完整性
openssl s_client -connect api.yourdomain.com:443 -servername api.yourdomain.com
# 在线验证工具
# 可以使用 SSL Labs (ssllabs.com) 进行验证
微信小程序测试
配置完成后,在微信开发者工具中测试API调用:
// 测试API请求
wx.request({
url: 'https://api.yourdomain.com/test',
method: 'GET',
success: function(res) {
console.log('API调用成功', res);
},
fail: function(err) {
console.log('API调用失败', err);
}
});
预防措施
1. 自动续期脚本优化
确保自动续期脚本能够正确生成完整证书链:
# 示例:Let's Encrypt自动续期
certbot renew --deploy-hook "cat /etc/letsencrypt/live/domain/cert.pem /etc/letsencrypt/live/domain/chain.pem > /path/to/nginx/cert/domain-fullchain.pem && nginx -s reload"
2. 监控检查
- 定期检查证书链完整性
- 监控微信小程序API调用状态
- 设置证书到期提醒
3. 常用验证工具
- SSL Labs: https://www.ssllabs.com/ssltest/
- SSL Checker: https://www.sslshopper.com/ssl-checker.html
- 命令行工具: OpenSSL
故障排查步骤
-
检查证书文件是否存在
ls -la /path/to/cert/ -
验证证书内容
openssl x509 -in cert/domain-chain.pem -text -noout -
检查Nginx配置语法
nginx -t -
查看Nginx错误日志
tail -f /var/log/nginx/error.log
总结
问题根源: SSL证书链不完整导致微信小程序无法验证证书信任链
解决方法: 使用包含完整证书链的文件配置Nginx
经验教训:
- 免费证书自动续期时要注意证书链完整性
- 微信小程序对SSL证书要求较严格
- 配置变更后必须进行完整测试
- 建议使用在线工具验证SSL配置
最佳实践:
- 始终使用完整证书链文件
- 建立证书监控机制
- 定期验证SSL配置
- 保留配置变更记录

浙公网安备 33010602011771号