手机和操作系统
NET::ERR_CERT_AUTHORITY_INVALID:老安卓不信任 Let's Encrypt
NET::ERR_CERT_AUTHORITY_INVALID(Android 7.0 及以前)Android 7.0 及以前的设备打不开用 Let's Encrypt 证书的网站,是因为这些系统里没有 ISRG Root X1 根证书。 过去几年有一个来自更老根证书的交叉签名把问题掩盖了,这条交叉签名证书链已于 2024 年 9 月 30 日到期。结果就是:内置浏览器和大多数 App 报证书颁发机构错误,新手机一切正常。
先判断是网站的问题还是你设备的问题
网站检测通过而老手机报错,问题就在设备上:Android 7.1.1 之前的系统不认 Let's Encrypt 的根证书。用 SSL 检测 测网站:
curl ssl.sh/example.com
检测通过、而且签发者是 Let's Encrypt,就打开“设置 → 关于手机”确认版本:Android 7.1.1 及以上应该正常。用老手机的访客可以换用自带根证书库的浏览器(安卓版 Firefox 历来如此,前提是还提供适配你系统的版本),但长远来看还是要换受支持的设备。
原因
直接原因是 Android 7.1.1 之前的系统没有 ISRG Root X1;2024 年 9 月 30 日交叉签名到期后,这些设备再没有可用的验证路径。
1. 设备里没有这个根证书
Android 7.1.1 加入了 ISRG Root X1。更早的版本只信任出厂时带的根证书,不更新就永远拿不到新根。
2. DST Root CA X3 交叉签名结束了
Let's Encrypt 曾经用一条经过 DST Root CA X3 的证书链让老安卓继续可用,利用的是安卓不检查根证书是否过期。2024 年 Let's Encrypt 默认不再提供这条链,交叉签名证书也在 2024 年 9 月 30 日到期。看看服务器发的是哪条链:
openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null 2>/dev/null \
| grep -E "^ *[0-9] s:|i:"
3. App 用的是系统信任库
大多数安卓 App 用系统根证书。在老设备上会报 Trust anchor for certification path not found,哪怕某个自带根证书的浏览器能打开。
4. 嵌入式和长期服役设备
电视盒子、收银机、自助终端、车机经常跑着老安卓且无法升级,这在国内的门店、政务大厅等场景尤其常见,属于业务问题而不只是个人用户的问题。
在各浏览器/系统上的样子
只有 Android 7.0 及以前的设备报错,Android 7.1.1 及以后的设备和电脑浏览器都正常。
| 设备 | 显示内容 |
|---|---|
| Android 7.0 及以前,Chrome 或系统浏览器 | “您的连接不是私密连接”,代码 NET::ERR_CERT_AUTHORITY_INVALID |
| Android 7.0 及以前,App | Trust anchor for certification path not found |
| Android 7.1.1 及以后 | 正常 |
| 电脑浏览器 | 正常 |
站长怎么修
站长先决定要不要支持老设备;要支持,就给这些设备访问的域名换用证书链兼容的 CA,或者在自家 App 里内置 ISRG Root X1。
1. 先确定要不要支持老设备。 看统计里 Android 7.1.1 以下的占比。普通网站往往很少,但终端设备、合作方设备可能很重要。
2. 给这些设备访问的域名换用证书链兼容的 CA(比如单独给接口用一个域名)。查看各家 CA 的兼容性说明,在真实的老设备上测试,再用 curl ssl.sh/example.com 和 证书链工具 核对。在阿里云、腾讯云购买证书时,也可以向客服确认该品牌证书链对老安卓的兼容情况。
3. 自家 App 在系统根证书之外内置 ISRG Root X1。Android 7.0 用网络安全配置;Android 6 及以前,用“系统根证书 + 内置根证书”构造的 TrustManager(比如 OkHttp 的 HandshakeCertificates 加上平台证书),绝不要用信任一切的实现。
4. 关注根证书变化。 在 Let's Encrypt 时间线 上跟踪证书链的调整,避免下次再被打个措手不及。
常见问题
怎么看手机的安卓版本?
打开“设置 → 关于手机”,找“Android 版本”。国产手机可能把它放在“我的设备”“全部参数”之类的页面里,系统名(如 EMUI、MIUI)下面会标注对应的安卓版本。7.0 及以下的,系统浏览器和大多数 App 都不会信任 Let's Encrypt 网站。
能在老手机上自己装 ISRG Root X1 吗?
可以作为用户证书安装,之后系统浏览器可能就能打开 Let's Encrypt 网站。但在 Android 7.0 上,App 默认仍然忽略用户证书。根证书只从 Let's Encrypt 官网下载,也要记住:不再更新的手机还缺很多其他安全补丁。
换个 CA 就能让所有老设备都正常吗?
只有新 CA 的证书链最终连到这些设备本来就信任的根证书时才行。看各家 CA 的兼容性文档,切换前在需要支持的最老设备上实测。