Android真机API22出现Trust anchor未找到异常,模拟器正常求助
我开发了一款连接HelioHost的Android应用,在API 33模拟器上运行正常,但在API 22真机上抛出如下异常:javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
触发异常的代码如下:
protected String doInBackground(String... strings) { String username = strings[0]; String activationKey = strings[1]; InputStream inStream = null; String response = null; try { ContentValues values=new ContentValues(); values.put("username", username); values.put("activationKey", activationKey); URL url = new URL("https://zelda82.heliohost.org/activation.php"); HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); OutputStream os = conn.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); writer.write(getQuery(values)); writer.flush(); writer.close(); os.close(); BufferedReader reader = new BufferedReader(new InputStreamReader((conn.getInputStream()))); response = reader.readLine(); reader.close(); } catch(Exception e) { e.printStackTrace(); } return response; }
服务器维护前无此问题,请问是服务器配置错误还是其他原因?
这个问题大概率是服务器维护后更新了SSL证书,但证书链配置不兼容Android 5.1(API22)及以下版本导致的,具体分析和解决方向如下:
证书兼容性核心原因
Android 5.1及更早版本的系统信任库默认不支持部分新型根证书。比如当前广泛使用的Let's Encrypt ISRG Root X1根证书,Android 5.1系统原生信任库中没有这个锚点——如果服务器配置时仅提供了新根证书的链,未包含兼容旧系统的交叉签名证书(比如DST Root CA X3),旧设备就无法完成证书合法性验证,从而抛出「信任锚找不到」的异常。服务器配置验证方法
可以用命令行检查服务器的证书链完整性:openssl s_client -connect zelda82.heliohost.org:443 -showcerts正常返回结果应包含完整的证书层级(根证书+中间证书),如果链缺失或根证书不在Android 5.1信任库内,即可确认是服务器配置问题。
客户端临时兼容方案
如果无法立即修改服务器配置,可在应用内手动导入服务器的根证书到本地信任库,让API22设备信任该证书。注意:绝对不要直接禁用SSL验证,会导致严重安全风险。服务器侧修复建议
联系HelioHost管理员,确认证书链是否配置了兼容旧Android系统的交叉签名。以Let's Encrypt证书为例,需要同时提供ISRG Root X1和DST Root CA X3的交叉签名链,才能覆盖新老设备的验证需求。
内容的提问来源于stack exchange,提问作者zeldafan

