微信小程序或app内嵌webview报“证书链不信任”,绝大多数情况是服务端未发送完整证书链,即nginx未配置fullchain.pem,导致微信x5内核、ios webview等无法逐级回溯至其内置信任根证书。

微信小程序或App内嵌WebView报“证书链不信任”,绝大多数情况不是证书无效,而是服务端没把完整证书链发给客户端。浏览器常能自动补全中间证书,但微信X5内核、iOS WebView、部分安卓Webview不会——它们只认你实际发送的证书链。排查核心就一条:确认Nginx是否在TLS握手时返回了从域名证书→中间CA→根CA的完整路径。
用在线工具快速验证证书链完整性
打开 myssl.com,输入完整URL(含https://和端口,如 https://api.example.com:443)。重点看两项:
- 证书评级:若为B级或更低,大概率链不完整;A+才是理想状态
- 证书链信息:右侧明确标出“证书链不完整”或只列出1个证书(仅你的域名证书),即问题确凿
命令行自查:openssl s_client是最准的现场证据
在服务器或本地执行:
openssl s_client -connect api.example.com:443 -servername api.example.com -showcerts
观察输出中 -----BEGIN CERTIFICATE----- 出现几次:
- 只出现1次 → 仅发了域名证书,缺中间证书
- 出现2次 → 域名证书 + 中间证书(常见于Let’s Encrypt R3)
- 出现3次 → 域名证书 + 中间证书 + 根证书(不必要,但无害)
注意:微信不信任根证书本身,它只关心能否从你发的证书逐级向上找到它内置信任的根。所以关键是要有中间证书,不是根证书。
检查Nginx配置是否用了fullchain.pem
Nginx必须用ssl_certificate指向包含完整链的文件(通常是fullchain.pem),而非单独的cert.pem。错误配置示例:
# ❌ 错误:只配域名证书,链断裂 ssl_certificate /etc/letsencrypt/live/example.com/cert.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; <h1>✅ 正确:用fullchain.pem,它 = cert.pem + chain.pem</h1><p>ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;</p>
可手动检查:cat fullchain.pem | grep -c "BEGIN CERTIFICATE" 应返回≥2。
特殊场景:多级中间证书或国产CA需额外处理
某些CA(如TrustAsia、CFCA、沃通)签发的证书含两级中间证书。Let’s Encrypt新版ISRG Root X1在iOS微信中兼容性差,建议强制回退到X3链或改用ZeroSSL。若用acme.sh部署,加参数:--preferred-chain "ISRG Root X2"。对自建Nginx,还可显式拼接:
cat your_domain.crt intermediate1.crt intermediate2.crt > fullchain_custom.pem
再将该文件设为ssl_certificate目标。验证后重启Nginx并重测。











