大多数情况下是因为服务器配置只引用了单张证书文件,需要改为引用包含中间证书的完整链条文件,并重启服务。
先说结论:服务器未发送完整的证书链,导致安卓设备无法构建信任路径,需配置服务器发送 fullchain。
- 先确认:检查服务器配置的证书路径是否为 fullchain.pem
- 先处理:更新 Web 服务器配置指向完整证书链文件
- 再验证:使用 OpenSSL 或在线工具检查链条完整性
命令速用版
在本地电脑或任意能联网的机器上,执行以下命令查看服务端返回的证书链:
openssl s_client -connect 你的域名:443 -showcerts
如果返回的证书列表中只有叶子证书,没有中间证书,说明链条不完整。
为什么会这样
浏览器和操作系统内置了受信任的根证书列表。Let's Encrypt 的证书由中间证书签发,中间证书再由根证书签发。安卓设备(尤其是旧版本)信任库与桌面端不同,如果服务器只发送叶子证书,设备无法找到对应的中间证书来完成信任链验证,从而报错。
此外,Let's Encrypt 的根证书有过变更,旧版安卓可能不信任新的根证书,必须依赖服务器发送正确的中间证书来构建交叉签名链条。
分步处理
1. 找到正确的证书文件
使用 Certbot 等工具续签后,通常会在 /etc/letsencrypt/live/你的域名/ 目录下生成四个文件。你需要使用的是 fullchain.pem,而不是 cert.pem。
2. 修改 Web 服务器配置
Nginx 配置示例:
ssl_certificate /etc/letsencrypt/live/你的域名/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/你的域名/privkey.pem;
Apache 配置示例:
SSLCertificateFile /etc/letsencrypt/live/你的域名/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/你的域名/privkey.pem
3. 重启服务
修改配置后必须重载或重启服务才能生效。
nginx -s reload # 或 systemctl restart apache2
怎么验证是否生效
1. 命令行验证
再次运行 openssl s_client 命令,观察输出中是否有 Certificate chain 部分,且包含多张证书。
2. 在线工具验证
使用 SSL Labs 等公开测试工具扫描域名,查看 Certificate Chain 部分是否显示完整且信任状态为绿色。
3. 真机测试
使用报错的安卓设备访问 HTTPS 页面,确认不再弹出安全警告。
常见坑
1. 证书顺序错误
如果手动合并证书,必须确保叶子证书在前,中间证书在后。直接使用 fullchain.pem 通常已处理好顺序。
2. 服务未重载
修改配置后忘记重启 Web 服务,导致旧证书仍在内存中。
3. 客户端缓存
部分安卓应用或系统会缓存证书状态,测试前尝试清除浏览器缓存或重启应用。
4. 旧版安卓兼容性
Android 7.1.1 以下版本信任库较旧,确保服务器发送的链条包含兼容的中间证书交叉签名。