Android Studio中调用urlConnection.connect()时出现javax.net.ssl.SSLException: Unable to parse TLS packet header异常的解决求助
解决Android中HttpURLConnection调用HTTPS接口出现的
javax.net.ssl.SSLException: Unable to parse TLS packet header异常 这个异常我之前对接HTTPS接口时也碰到过,本质是客户端和服务端的TLS握手流程出了问题,下面是几个实用的排查和解决方向:
1. 先确认协议与服务端端口是否匹配
你当前用HTTPS协议访问8006端口,但很多非标准端口实际跑的是HTTP服务而非HTTPS。如果服务端在8006端口提供的是HTTP服务,客户端用HTTPS发起连接就会因为无法解析TLS头部而报错。
- 解决方式:
- 联系服务端确认端口对应的协议,如果是HTTP,直接把URL改成
http://IP:8006/Calculator/product; - 如果确实是HTTPS,让服务端确认
8006端口是否正确配置了SSL证书和TLS服务。
- 联系服务端确认端口对应的协议,如果是HTTP,直接把URL改成
2. 适配服务端支持的TLS版本
旧版本Android(比如Android 5.0以下)默认没开启TLS 1.2及以上版本,如果服务端只支持高版本TLS,就会握手失败。就算是高版本Android,也可以手动指定兼容的TLS版本:
URL url = new URL("https://IP:8006/Calculator/product"); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); // 手动指定支持的TLS版本 if (urlConnection instanceof HttpsURLConnection) { HttpsURLConnection httpsConn = (HttpsURLConnection) urlConnection; SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); sslContext.init(null, null, new SecureRandom()); httpsConn.setSSLSocketFactory(sslContext.getSocketFactory()); // 若服务端支持TLS1.3,也可以加上 // httpsConn.setEnabledProtocols(new String[]{"TLSv1.2", "TLSv1.3"}); } urlConnection.setRequestMethod("GET"); urlConnection.connect();
注意:TLS1.3需要Android API 29及以上原生支持,低版本需额外适配。
3. 处理服务端证书信任问题
如果服务端用的是自签名证书或未被Android系统信任的证书,也会导致TLS握手失败。测试环境下可以临时信任所有证书(生产环境绝对禁止这么做,会带来严重安全风险):
// 创建信任所有证书的TrustManager TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } @Override public void checkClientTrusted(X509Certificate[] certs, String authType) {} @Override public void checkServerTrusted(X509Certificate[] certs, String authType) {} } }; // 初始化SSLContext SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustAllCerts, new SecureRandom()); URL url = new URL("https://IP:8006/Calculator/product"); HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection(); urlConnection.setSSLSocketFactory(sslContext.getSocketFactory()); // 跳过主机名验证(仅测试环境用) urlConnection.setHostnameVerifier((hostname, session) -> true); urlConnection.setRequestMethod("GET"); urlConnection.connect();
生产环境请使用正规CA机构颁发的证书,并将证书导入到Android项目中配置信任。
4. 排查网络层面问题
防火墙、代理或者网络不稳定也可能导致TLS数据包损坏,你可以先用curl命令测试服务端是否正常:
curl -v https://IP:8006/Calculator/product
如果curl也报错,说明问题出在服务端或网络上,需要联系运维确认服务状态和网络连通性。
内容的提问来源于stack exchange,提问作者sujitha




