2021年9月29日起安卓HttpURLConnection调用Let's Encrypt证书站点失败
问题根因
- 首先可以排除旧设备不兼容ISRG Root X1的问题,你遇到的全设备报错、浏览器访问正常的现象,核心是系统原生网络组件和浏览器的证书信任逻辑差异导致的:
- Chrome等浏览器自身内置了独立的根证书库,内置了ISRG Root X1证书,验证时会优先使用自身的信任库,不受系统根证书和站点证书链配置的影响,所以访问正常。
- HttpURLConnection默认使用安卓系统的根证书信任库,且验证证书链时会优先匹配链中最先出现的根锚点。Let's Encrypt默认签发的是兼容旧设备的长证书链,链的末端锚定到已经过期的DST Root CA X3,HttpURLConnection匹配到这个过期根证书后会直接判定证书无效,不会尝试 fallback 匹配系统中已存在的有效ISRG Root X1根证书,因此无论设备新旧都会抛出证书错误。
- 若你的应用此前配置过证书锁定,锁定了旧的R3 intermediate证书或DST Root CA X3的指纹,也会触发全设备的证书校验失败。
HttpURLConnection的状态说明
HttpURLConnection并未被弃用,官方至今仍在维护该组件,无需强制替换为其他网络组件。如果你的应用本身没有其他网络库的使用需求,不需要盲目做迁移。
可行解决方案
- 方案1:调整站点证书链配置,将Let's Encrypt签发的证书链切换为锚定ISRG Root X1的短链,不再包含指向DST Root CA X3的交叉签名部分,HttpURLConnection就可以正常匹配系统中的ISRG Root X1根证书完成验证。
- 方案2:无需修改站点配置,在应用中内置ISRG Root X1根证书,给HttpURLConnection配置自定义的TrustManager,优先信任内置的ISRG根证书,即可跳过过期DST根的校验逻辑。
- 方案3:若此前配置了证书锁定,更新锁定的指纹为当前有效R3证书或ISRG Root X1根证书的指纹即可。
内容的提问来源于stack exchange,提问作者Hong
相关产品推荐
相关产品推荐

