nginx未发送完整证书链导致webview证书错误,需用fullchain.pem(域名证+中间证)替换cert.pem,并确保ssl_certificate指向该文件,验证openssl输出含2段证书。

小程序或App内嵌WebView请求失败,报“证书链不信任”“errno:600001”“NET::ERR_CERT_AUTHORITY_INVALID”等错误,95%以上是Nginx没发完整证书链——只发了域名证书,没带中间证书。浏览器常能自动补全,但微信X5内核、iOS WebView、多数安卓Webview(尤其Android 7+)不会补,必须靠服务端主动下发。
确认问题:看证书链是否真的完整
别信浏览器小锁图标,要用真实握手数据验证:
- 在Linux服务器上执行:
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com -showcerts
观察输出中-----BEGIN CERTIFICATE-----出现几次:只1次 → 链断裂;2次(域名证+中间证)→ 合格;3次(含根证)→ 无害但非必需 - 用在线工具交叉验证:myssl.com 输入完整URL(如 https://api.yourdomain.com),重点看“证书链信息”栏是否标红提示“不完整”,或评级低于A级
修复核心:用 fullchain.pem 替换 cert.pem
Nginx的ssl_certificate必须指向包含**域名证书 + 中间证书**的合并文件,顺序不能错,根证书不用加:
- Let’s Encrypt用户:直接用
/etc/letsencrypt/live/yourdomain.com/fullchain.pem(它 = cert.pem + chain.pem) - 阿里云/腾讯云用户:下载Nginx版证书包,里面
full_chain.crt或1_root_bundle.crt就是你要的 - 手动合并(如只有单独的
domain.crt和intermediate.crt):
cat domain.crt intermediate.crt > fullchain.pem
注意:先放域名证书,再追加中间证书;不要包含根证书 - 验证合并结果:
cat fullchain.pem | grep -c "BEGIN CERTIFICATE" 应返回≥2
检查Nginx配置是否写对
常见错误配置和正确写法对比:
- ❌ 错误:
ssl_certificate /path/to/domain.crt;ssl_certificate_key /path/to/domain.key; - ✅ 正确:
ssl_certificate /path/to/fullchain.pem;ssl_certificate_key /path/to/domain.key; - ⚠️ 注意:
ssl_trusted_certificate不是用来修服务端链的——它只用于客户端证书校验(如双向TLS)或反向代理上游验证,配了也不解决当前问题
重载并二次验证
改完配置别跳过关键步骤:
- 语法检查:nginx -t(必须显示success)
- 重载生效:nginx -s reload 或 systemctl reload nginx
- 立刻复测:
再跑一次openssl s_client命令,确认输出有2段证书;
用真机访问小程序或App,观察是否恢复;
可顺手清下手机浏览器缓存或HSTS记录(安卓Chrome访问 chrome://net-internals/#hsts)











