You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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服务。

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

火山引擎 最新活动