Let's Encrypt 续签后证书链不完整导致安卓设备报错怎么补救?

文章导读
大多数情况下是因为服务器配置只引用了单张证书文件,需要改为引用包含中间证书的完整链条文件,并重启服务。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
A A

大多数情况下是因为服务器配置只引用了单张证书文件,需要改为引用包含中间证书的完整链条文件,并重启服务。

先说结论:服务器未发送完整的证书链,导致安卓设备无法构建信任路径,需配置服务器发送 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。

Let's Encrypt 续签后证书链不完整导致安卓设备报错怎么补救?

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. 命令行验证

Let's Encrypt 续签后证书链不完整导致安卓设备报错怎么补救?

再次运行 openssl s_client 命令,观察输出中是否有 Certificate chain 部分,且包含多张证书。

2. 在线工具验证

使用 SSL Labs 等公开测试工具扫描域名,查看 Certificate Chain 部分是否显示完整且信任状态为绿色。

3. 真机测试

使用报错的安卓设备访问 HTTPS 页面,确认不再弹出安全警告。

常见坑

1. 证书顺序错误

如果手动合并证书,必须确保叶子证书在前,中间证书在后。直接使用 fullchain.pem 通常已处理好顺序。

Let's Encrypt 续签后证书链不完整导致安卓设备报错怎么补救?

2. 服务未重载

修改配置后忘记重启 Web 服务,导致旧证书仍在内存中。

3. 客户端缓存

部分安卓应用或系统会缓存证书状态,测试前尝试清除浏览器缓存或重启应用。

4. 旧版安卓兼容性

Android 7.1.1 以下版本信任库较旧,确保服务器发送的链条包含兼容的中间证书交叉签名。